2015-04-02 49 views
1

我有这种怪异的情况下,我无法解释:可变行为红宝石

@@test = 1234 

def m 
    puts @@test 
end 

class Test 
    @@test = 5678 
end 

m 

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

,如果我不定义1234,则未声明的变量错误。

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

我对此很困惑。

回答

3

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

这是因为@@test是一个类变量,这是它的类的儿童类之间共享。您将其定义在顶层,并且顶层具有类Object的范围,并且方法m变为Object类的私有方法。所以,当你从顶层调用m时,你会得到输出为1234

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

正如我所说的类的变量是共享Test默认为子类Object。在Test里面,你修改了共享变量@@test。这就是为什么现在呼叫m正在给出当前更新值@@test这是5678

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

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