クラス変数とクラスレベルで定義される変数の違いは何ですか?クラス変数とクラスレベルで定義された変数との違い
barは、@@
で定義されています。つまり、クラス変数であり、クラス内のすべてのメソッドでアクセス可能です。
class Foo
@@bar = 'bar'
end
ので@@
なしbar
を行い、その違いは何ですか..?
class Foo
bar = 'bar'
end
クラス変数とクラスレベルで定義される変数の違いは何ですか?クラス変数とクラスレベルで定義された変数との違い
barは、@@
で定義されています。つまり、クラス変数であり、クラス内のすべてのメソッドでアクセス可能です。
class Foo
@@bar = 'bar'
end
ので@@
なしbar
を行い、その違いは何ですか..?
class Foo
bar = 'bar'
end
さて、2番目のオプションで、bar
はend
に到達したときにスコープから外れローカル変数です。そのため、クラスのどのメソッド(クラスメソッドもインスタンスメソッドも)からアクセスすることはできません。
Rubyでは、すべての子クラスとそのインスタンスとインスタンス変数(@bar
)間で共有されるクラス変数(@@bar
)があります。クラスもRubyのオブジェクトであるため、インスタンス変数クラスレベル(またはより正確に:あなたのクラスのシングルトンクラス上)に。これは、このように動作することができます:クラス変数に比べ
class Foo
def self.bar
@bar
end
def self.bar=(value)
@bar = value
end
end
、シングルトンクラスにこれらのインスタンス変数はFoo
インスタンスも上にアクセスすることはできません子クラスはFoo
。
@@bar
は、クラス内のすべてのメソッドと同じ変数だけでなく、クラスのすべてのインスタンスに同じ変数を返します。
私がクラス変数(@@変数)を考える方法は、名前空間のグローバル変数です。それらの使い方は、グローバル変数を使用する場合ほど厄介ですが、あなたのクラスで定義されたコード内にスコープを限定しているわけではありません。
一般的に、アプリケーション全体で何らかの状態を追跡するために使用されます。
たとえば、インスタンス化された兄弟オブジェクトを識別できるようにする必要があるオブジェクトがあるとします。今
class MyThing
def initialize
$latest_thing = self
end
def latest
$latest_thing
end
end
thing1 = MyThing.new
thing1.latest # => thing1
thing2 = MyThing.new
thing1.latest # => thing2
thing2.latest # => thing2
、一般的に悪い習慣として知覚されるグローバル変数、グローバル名前空間の汚染のためであることの理由の一つと命名のリスクを使用しています。それをする 一つの方法は、グローバル変数経由になります衝突や他の誰かがそれを変更する。
あなたはインスタンス間のこの共有状態を必要とするこのような状況を扱っているが、誰が外に、あなたはまさにグローバルのようなクラス変数を使用することができ、それについて知っておく必要がない場合:
class MyThing
def initialize
@@latest_thing = self
end
def latest
@@latest_thing
end
end
thing1 = MyThing.new
thing1.latest # => thing1
thing2 = MyThing.new
thing1.latest # => thing2
thing2.latest # => thing2
サードパーティのコードでは、単にグローバルが使われていたとしても、できるだけ早く@@latest_thing = :something_else
を行うことができないので、これは一般的にはよりクリーンで安全です。
希望に役立ちます。私は、クラス変数はほとんど使用されていない、または野生で奨励されると思いますが、まれに、このようなもののために使用する必要がありました。
グローバルは実際には非常に悪いですが、スコープは広すぎますが、クラスレベルの変数は近いです。あなたが必要とする時間の99%は、これがメソッドである 'self.class.latest_thing = self'のような、あなたのためにこれを中間にできるクラスレベルのメソッドです。クラスそのものは自由に解釈できますが、適合すると見なします。 – tadman
違いは、あなたのステートメントが間違っていることです。あなたはそれを試しましたか? –