14

@@class_varRubyではクラス変数(例)を避け、@instance_var代わりにクラススコープでインスタンス変数(例)を使用する必要があると言う人もいます。

def MyClass
  @@foo = 'bar' # Should not do this.
  @foo = 'bar'  # Should do this.
end

Rubyでクラス変数の使用が嫌われるのはなぜですか?

4

2 に答える 2

27

クラス変数は、継承に関して時々混乱する振る舞いのために、しばしば悪意を持っています。

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

多くの場合、これはより便利です。

于 2010-09-24T13:05:42.617 に答える
6

気をつけて; クラス@@variablesとインスタンス@variablesは同じものではありません。

基本的に、基本クラスでクラス変数を宣言すると、それはすべてのサブクラスと共有されます。サブクラスでその値を変更すると、継承ツリーのずっと下にある基本クラスとそのすべてのサブクラスに影響します。多くの場合、この動作はまさに望ましいものです。しかし、同様に多くの場合、この動作はプログラマーが意図したものではなく、特にプログラマーがクラスが他の誰かによってサブクラス化されることを当初は期待していなかった場合、バグにつながります。

差出人:http ://sporkmonger.com/2007/2/19/instance-variables-class-variables-and-inheritance-in-ruby

于 2010-09-24T13:07:52.240 に答える