Ruby中的变量行为

时间:2015-04-02 07:40:27

标签: ruby

我有这个奇怪的情况,我无法解释:

@@test = 1234

def m
  puts @@test
end

class Test
  @@test = 5678
end

m

如果我没有定义5678,则输出为1234。

如果我没有定义1234,那么未声明的变量错误。

现在,如果我定义1234,输出是5678,为什么?

我真的很困惑。

1 个答案:

答案 0 :(得分:3)

  

如果我没有定义5678,则输出为1234。

这是因为@@test是一个类变量,它在类的子类之间共享。您在顶层定义了它,并且顶层具有类Object的范围,方法m成为Object类的私有方法。因此,当您从顶层调用m时,您将获得1234的输出。

  

现在,如果我定义1234,则输出为5678,

正如我所说,类变量是共享。默认情况下,TestObject的子类。在Test内,您修改了共享变量@@test。这就是为什么现在调用m正在提供@@test 5678的当前更新值。

  

如果我没有定义1234,那么未声明的变量错误。

没错。如果您在定义类变量之前尝试使用它,那么您将获得未初始化的类变量@@ test 的异常。