@@class_var
Rubyではクラス変数(例)を避け、@instance_var
代わりにクラススコープでインスタンス変数(例)を使用する必要があると言う人もいます。
def MyClass
@@foo = 'bar' # Should not do this.
@foo = 'bar' # Should do this.
end
Rubyでクラス変数の使用が嫌われるのはなぜですか?
@@class_var
Rubyではクラス変数(例)を避け、@instance_var
代わりにクラススコープでインスタンス変数(例)を使用する必要があると言う人もいます。
def MyClass
@@foo = 'bar' # Should not do this.
@foo = 'bar' # Should do this.
end
Rubyでクラス変数の使用が嫌われるのはなぜですか?
クラス変数は、継承に関して時々混乱する振る舞いのために、しばしば悪意を持っています。
class Foo
@@foo = 42
def self.foo
@@foo
end
end
class Bar < Foo
@@foo = 23
end
Foo.foo #=> 23
Bar.foo #=> 23
代わりにクラスインスタンス変数を使用すると、次のようになります。
class Foo
@foo = 42
def self.foo
@foo
end
end
class Bar < Foo
@foo = 23
end
Foo.foo #=> 42
Bar.foo #=> 23
多くの場合、これはより便利です。
気をつけて; クラス@@variables
とインスタンス@variables
は同じものではありません。
基本的に、基本クラスでクラス変数を宣言すると、それはすべてのサブクラスと共有されます。サブクラスでその値を変更すると、継承ツリーのずっと下にある基本クラスとそのすべてのサブクラスに影響します。多くの場合、この動作はまさに望ましいものです。しかし、同様に多くの場合、この動作はプログラマーが意図したものではなく、特にプログラマーがクラスが他の誰かによってサブクラス化されることを当初は期待していなかった場合、バグにつながります。
差出人:http ://sporkmonger.com/2007/2/19/instance-variables-class-variables-and-inheritance-in-ruby