为什么要在Ruby中避免使用@@ class_variables?

时间:2010-09-24 12:44:48

标签: ruby class-variables class-instance-variables

我知道有人说在Ruby中应该避免使用类变量(例如@@class_var),而应该在类范围中使用实例变量(例如@instance_var):

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

为什么在Ruby中使用类变量不受欢迎?

2 个答案:

答案 0 :(得分: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

这通常更有用。

答案 1 :(得分:6)

小心;类@@variables和实例@variables不是一回事。

  

基本上,当你宣布一个班级时   基类中的变量,它是共享的   与所有子类。改变它   子类中的值会影响   基类及其所有子类   一直到继承树。   这种行为通常就是这样   期望。但同样经常,这个   行为不是预期的   程序员,它导致错误,   特别是如果程序员没有   原本期望上课   由其他人划分。

来自:http://sporkmonger.com/2007/2/19/instance-variables-class-variables-and-inheritance-in-ruby