我认为类变量和实例变量之间没有明显区别。
不,有细微的差别。正如韦恩康拉德在他的回答中所说:
类变量 (@@) 在类及其所有后代之间共享。
类实例变量 (@) 不被类的后代共享。
@@ : 类变量(我会推荐使用class instance variable
代替。而不是说class variable
,这将减少混乱,新手通常会这样做。)
class Foo;end
#setting class variable @@var
Foo.class_variable_set(:@@var, "good morning!")
#getting class variable @@var via Foo
Foo.class_variable_get(:@@var) # => "good morning!"
class Bar < Foo ;end
#getting class variable @@var via Bar subclass of Foo
Bar.class_variable_get(:@@var) # => "good morning!"
@ : 实例变量
class Foo;end
foo = Foo.new
#setting instance variable @var
foo.instance_variable_set(:@var, "good morning!")
#getting instance variable @var via foo object
foo.instance_variable_get(:@var) # => "good morning!"
class Bar < Foo ;end
bar = Bar.new
#getting instance variable @var via bar object,whose class is a subclass of Foo
bar.instance_variable_get(:@var) # => nil