で始まる@
変数はインスタンス変数、他の言語では「プロパティ」です。「クラシック」変数はメソッド/ブロックのスコープに対してローカルですが、インスタンス変数は特定instance
のオブジェクトに対してローカルです。次に例を示します。
class Foo
def initialize(bar)
@bar = bar
end
def bar
@bar # the variable is specific to this instance
end
def buzz
buzz = 'buzz' # this variable is not accessible outside of this method
end
end
で始まる変数も表示@@
される場合があります。これらはクラス変数であり、クラスのすべてのインスタンスからアクセスでき、サブクラスのすべてのインスタンスと共有されます。これらの変数の使用は、主にサブクラスが変数を共有し、多くの混乱を引き起こす可能性があるため、通常は推奨されません。
Ruby ではすべてがオブジェクトであり、クラスはオブジェクト ( class のインスタンスClass
) であるため、クラス インスタンス変数を使用することもできます。
class Foo
def self.bar
@bar #we are in class Foo's scope, which is an instance of class Class
end
def self.bar=(bar)
@bar = bar
end
def bar
@bar # Foo.new.bar != Foo.bar
end
end
「コロン付きの変数」と呼ばれるものは変数ではありません。それらはシンボルと呼ばれる特定のタイプの文字列であり、不変であり、インタープリターによる迅速な識別のために最適化されています。実際、これらはポインターとして内部的に保存されるため:this == :this
、非常に迅速な操作です。
このプロパティは、迅速な検索やメソッドに渡す「フラグ」を提供するため、ハッシュ キーの適切な候補になります。それらは、それらが言うことを「表す」一種の緩やかな定数と考えてください。それらの不変性も危険です。これまでに作成されたすべてのシンボルはガベージ コレクションされません。何千ものシンボルを作成することで簡単にメモリ リークが発生するため、それらを賢く使用してください。
Ruby 2.2 シンボルは、特定の場合 (参照が保持されず、比較が不要な場合) にガベージ コレクションされる可能性があるため、更新します。