可变行为红宝石
问题描述:
我有这种怪异的情况下,我无法解释:可变行为红宝石
@@test = 1234
def m
puts @@test
end
class Test
@@test = 5678
end
m
,如果我不定义5678,则输出为1234
,如果我不定义1234,则未声明的变量错误。
现在,如果我定义1234,输出是5678,为什么?
我对此很困惑。
答
如果我不定义5678,则输出为1234
这是因为@@test
是一个类变量,这是它的类的儿童类之间共享。您将其定义在顶层,并且顶层具有类Object
的范围,并且方法m
变为Object
类的私有方法。所以,当你从顶层调用m
时,你会得到输出为1234
。
现在,如果我定义1234,输出是5678,
正如我所说的类的变量是共享。 Test
默认为子类Object
。在Test
里面,你修改了共享变量@@test
。这就是为什么现在呼叫m
正在给出当前更新值@@test
这是5678
。
如果我没有定义1234,那么未声明的变量错误。
没有错。如果您在定义它们之前尝试使用类变量,将会得到异常,如未初始化的类变量@@ test。