类变量(@@
)在类及其所有子类之间共享.类实例变量(@
)不被类的子体共享.
Class variable (100)
让我们有一个类Foo和一个类变量@@i
,以及读写@@i
的访问器:
class Foo
@@i = 1
def self.i
@@i
end
def self.i=(value)
@@i = value
end
end
以及派生类:
class Bar < Foo
end
我们看到Foo和Bar对于@@i
有相同的值:
p Foo.i # => 1
p Bar.i # => 1
一个改变@@i
个,两个都会改变:
Bar.i = 2
p Foo.i # => 2
p Bar.i # => 2
Class instance variable (100)
让我们用类实例变量@i
和读写访问器@i
创建一个简单的类:
class Foo
@i = 1
def self.i
@i
end
def self.i=(value)
@i = value
end
end
以及派生类:
class Bar < Foo
end
我们看到,尽管Bar继承了@i
的访问器,但它本身并没有继承@i
:
p Foo.i # => 1
p Bar.i # => nil
我们可以在不影响Foo's @i
的情况下设置Bar's @i
:
Bar.i = 2
p Foo.i # => 1
p Bar.i # => 2