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