0

请解释,我无法理解。类别变量

class Foo 
    @a = 123 
    @@b = 123 
end 

变量对象类和类变量的优点是什么?我应该什么时候第一次使用,哪一秒?

回答

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 
+0

此代码打印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

+0

因为你不能在类作用域中初始化成员变量,所以你需要在一个方法内部(通常是构造函数'initialize')完成它。从文档中:'一个实例变量的名字以@开始,其范围限制在self指向的任何对象上.'在你的代码中'self'不引用该类作用域,所以该变量未初始化。 – 2011-06-06 20:05:18

+0

谢谢你的解释 – user413881 2011-06-06 20:13:55

1

当你想在类的所有实例共享变量使用类变量,当你想用一个实例变量,每个实例有它自己的非共享变量。