2017-08-29 6 views
1

クラス変数とクラスレベルで定義される変数の違いは何ですか?クラス変数とクラスレベルで定義された変数との違い

barは、@@で定義されています。つまり、クラス変数であり、クラス内のすべてのメソッドでアクセス可能です。

class Foo 
    @@bar = 'bar' 
end 

ので@@なしbarを行い、その違いは何ですか..?

class Foo 
    bar = 'bar' 
end 
+4

違いは、あなたのステートメントが間違っていることです。あなたはそれを試しましたか? –

答えて

1

さて、2番目のオプションで、barendに到達したときにスコープから外れローカル変数です。そのため、クラスのどのメソッド(クラスメソッドもインスタンスメソッドも)からアクセスすることはできません。

Rubyでは、すべての子クラスとそのインスタンスとインスタンス変数(@bar)間で共有されるクラス変数(@@bar)があります。クラスもRubyのオブジェクトであるため、インスタンス変数クラスレベル(またはより正確に:あなたのクラスのシングルトンクラス上)に。これは、このように動作することができます:クラス変数に比べ

class Foo 
    def self.bar 
    @bar 
    end 

    def self.bar=(value) 
    @bar = value 
    end 
end 

、シングルトンクラスにこれらのインスタンス変数はFooインスタンスも上にアクセスすることはできません子クラスはFoo

0

@@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を行うことができないので、これは一般的にはよりクリーンで安全です。

希望に役立ちます。私は、クラス変数はほとんど使用されていない、または野生で奨励されると思いますが、まれに、このようなもののために使用する必要がありました。

+1

グローバルは実際には非常に悪いですが、スコープは広すぎますが、クラスレベルの変数は近いです。あなたが必要とする時間の99%は、これがメソッドである 'self.class.latest_thing = self'のような、あなたのためにこれを中間にできるクラスレベルのメソッドです。クラスそのものは自由に解釈できますが、適合すると見なします。 – tadman

関連する問題