在Ruby中,为什么未初始化的实例变量返回nil
而未初始化的类变量会引发NameError
?
比较
@some_uninitialized_variable # => nil
和
@@some_uninitialized_class_variable # => NameError
答案 0 :(得分:7)
我的观点如下:
未初始化的局部变量返回名称错误,因为Ruby不知道它是打算是局部变量还是不存在的方法。
如果未初始化的类变量在未定义时返回nil
,则当变量实际上由远程祖先赋值nil
时,可能会导致令人讨厌的错误。也就是说,我认为这是保护编码员。
如果使用经常使用的功能nil
,则在未初始化时,实例变量默认为@a = @a || []
。
答案 1 :(得分:0)
这似乎是Object#instance_variable_get
的工作方式。
我在猜你在IRB尝试这个。如果您打开提示并输入self
和self.class
,则可以看到您正在使用名为Object
的{{1}}。
但这只会回答在哪里部分问题(如果有的话),而不是为什么部分。