Ruby解释器假定所有的实例变量都属于当前对象self。在类定义时也是如此(在Ruby中类也是对象):
class MyClass @my_var = 1 end
在类定义的时候,self的角色由类本身担任,因此实例变量@my_var 属于这个类。
注意! 类的实例变量不等同于类的对象的实例变量,请看下面的例子:
class MyClass @my_var = 1 def self.read; @my_var; end def write; @my_var = 2; end def read; @my_var; end end obj = MyClass.new obj.write obj.read # => 2 MyClass.read # => 1
上面的代码定义了两个实例变量,它们正好都叫做 @my_var, 但是他们分属于不同的作用域,并属于不同的对象。
其中一个@my_var定义于obj充当self的时刻,因此它是obj对象的实例变量。
另外一个@my_var定义于MyClass充当sefl的时刻,因此它是MyClass的实例变量------也就是类实例变量。
类实例变量是属于Class类对象的普通实例变量,它仅仅可以被类本身所访问,而不能被类的实例或子类所访问。