Ruby中的变量行为
我有一个奇怪的案例,我无法解释:Ruby中的变量行为,ruby,Ruby,我有一个奇怪的案例,我无法解释: @@test = 1234 def m puts @@test end class Test @@test = 5678 end m 如果我没有定义5678,那么输出是1234 如果我没有定义1234,那么未声明的变量错误 现在,如果我定义1234,输出是5678,为什么 我真的被这搞糊涂了 如果我没有定义5678,那么输出是1234 这是因为@@test是一个类变量,在其类的子类之间共享。您在顶层定义了它,顶层具有类对象的范围,方法m成为对象类
@@test = 1234
def m
puts @@test
end
class Test
@@test = 5678
end
m
如果我没有定义5678,那么输出是1234
如果我没有定义1234,那么未声明的变量错误
现在,如果我定义1234,输出是5678,为什么
我真的被这搞糊涂了
如果我没有定义5678,那么输出是1234
这是因为@@test
是一个类变量,在其类的子类之间共享。您在顶层定义了它,顶层具有类对象
的范围,方法m
成为对象
类的私有方法。因此,当您从顶层调用m
时,您得到的输出是1234
现在,如果我定义1234,输出是5678
正如我所说,类变量是共享的<代码>测试默认情况下是对象的子类
。在测试中
您修改了共享变量@@Test
。这就是为什么现在调用m
会给出当前更新的@@test
值,即5678
如果我没有定义1234,那么未声明的变量错误
没问题。如果在定义类变量之前尝试使用该类变量,将得到异常为未初始化类变量@@test