我有这个奇怪的情况,我无法解释:
@@test = 1234
def m
puts @@test
end
class Test
@@test = 5678
end
m
如果我没有定义5678,则输出为1234。
如果我没有定义1234,那么未声明的变量错误。
现在,如果我定义1234,输出是5678,为什么?
我真的很困惑。
答案 0 :(得分:3)
如果我没有定义5678,则输出为1234。
这是因为@@test
是一个类变量,它在类的子类之间共享。您在顶层定义了它,并且顶层具有类Object
的范围,方法m
成为Object
类的私有方法。因此,当您从顶层调用m
时,您将获得1234
的输出。
现在,如果我定义1234,则输出为5678,
正如我所说,类变量是共享。默认情况下,Test
是Object
的子类。在Test
内,您修改了共享变量@@test
。这就是为什么现在调用m
正在提供@@test
5678
的当前更新值。
如果我没有定义1234,那么未声明的变量错误。
没错。如果您在定义类变量之前尝试使用它,那么您将获得未初始化的类变量@@ test 的异常。