0
Q
类别变量
A
回答
4
实例级别变量区域为类的每个实例重新创建。例如,对于Foo
的每个实例,变量@id
应该是唯一的。但是,对于每个类型的实例,可能有一些值应该是相同的。在这种情况下,类变量会更合适。
类别级变量的一个重要副作用是它们在派生类中共享以及。这意味着改变'Foo'子类的值也会改变'Foo'对象的值。这可能是你想要的,但找出困难的方式可能有点令人惊讶。
例如:
class Foo
@@some_var = 1
def bar
puts(@@some_var)
end
end
class Baz < Foo
def perhaps_unexpected
@@some_var = 10
Foo.new.bar #prints '10'
end
end
1
当你想在类的所有实例共享变量使用类变量,当你想用一个实例变量,每个实例有它自己的非共享变量。
此代码打印3和零。为什么? 'code'class MyClass的 \t @@全球= 3 \t @local = 7 \t \t DEF my_print \t \t放@@全球 \t \t提出@local \t端 端 OBJ = MyClass.new obj.my_print'code' – user413881 2011-06-06 19:57:53
因为你不能在类作用域中初始化成员变量,所以你需要在一个方法内部(通常是构造函数'initialize')完成它。从文档中:'一个实例变量的名字以@开始,其范围限制在self指向的任何对象上.'在你的代码中'self'不引用该类作用域,所以该变量未初始化。 – 2011-06-06 20:05:18
谢谢你的解释 – user413881 2011-06-06 20:13:55