在这个代码块中,
@@y = 1
class MyClass
@@y = 2
end
p @@y # => 2
天真地,它似乎@@y
在顶级范围内,并且与' 范围内@@y
的不一样。MyClass
为什么会@@y
受到类MyClass
定义的影响?(为什么是结果2
?)
在这个代码块中,
@@y = 1
class MyClass
@@y = 2
end
p @@y # => 2
天真地,它似乎@@y
在顶级范围内,并且与' 范围内@@y
的不一样。MyClass
为什么会@@y
受到类MyClass
定义的影响?(为什么是结果2
?)
让我们看看这个例子。这里@@x
in确实与inBar
分开。@@x
Foo
class Foo
@@x = 1
end
class Bar
@@x = 2
end
Foo.class_variable_get(:@@x) # => 1
Bar.class_variable_get(:@@x) # => 2
但是,如果Bar
是 的孩子,会发生什么Foo
?
class Foo
@@x = 1
end
class Bar < Foo
@@x = 2
end
Foo.class_variable_get(:@@x) # => 2
Bar.class_variable_get(:@@x) # => 2
在这种情况下,@@x
在两种情况下都是相同的,并且它是在 中声明的那个Foo
。
现在,回到你的例子:
@@y = 1
class MyClass
@@y = 2
end
p @@y
第一行在根范围内声明类变量。main
Root 是一个类型为 的特殊对象Object
。所以,本质上,你是在 class 上定义一个类变量Object
。由于一切都是一个Object
,这就是定义的MyClass
也继承@@y
并能够改变它的方式。
当你这样做
@@y = 1
你在对象上定义它。由于 MyClass 是 Object 的子类,因此它可以访问它的类变量。
@@y = 1
class MyClass
@@y = 2
end
p @@y
puts MyClass.superclass #=> Object
puts Object.class_variables #=> @@y