有些未声明的变量为零,有些则抛出错误。怎么样?
$ irb
1.9.3p0 :001 > asdf # local
NameError: undefined local variable or method `asdf' for main:Object
from (irb):1
from /Users/saizai/.rvm/rubies/ruby-1.9.3-p0/bin/irb:16:in `<main>'
1.9.3p0 :002 >@asdf # instance
=> nil
1.9.3p0 :003 >@@asdf # class
NameError: uninitialized class variable @@asdf in Object
from (irb):3
from /Users/saizai/.rvm/rubies/ruby-1.9.3-p0/bin/irb:16:in `<main>'
1.9.3p0 :004 > $asdf # global
=> nil
答案 0 :(得分:5)
必须始终指定类变量,否则当您尝试使用它们时,它们将返回NameError
。我目前没有详细说明原因。
实例和全局变量将返回nil
,即使它们未被分配。但是,如果您使用-w
标志运行脚本,它们将发出警告。
()
)。
something # could be a variable named 'something' or a method called 'something()'
如果没有为something
变量赋值,则Ruby解释器假定它是一个方法调用。如果没有该名称的方法,则会引发NameError
。这就是为什么你会得到这个消息:
NameError: undefined local variable or method 'something' for main:Object
from (irb):1
from path/to/Ruby/bin/irb:12 in '<main>'
因此,对于Ruby解释器来说,以这种方式处理局部变量非常重要,以防它实际上是您所指的方法。
作为一个有趣的旁注:
有一个怪癖 - 一个变量在Ruby时出现 解释器看到该变量的赋值表达式。这是 即使该分配没有实际执行也是如此。一个变量 存在但尚未赋值的默认值 价值零。
这意味着:
if false
z = "Something"
end
z.nil? #=> true
never_assigned.nil? #=> NameError
以上引用来自David Flanagan和Yukihiro Matsumoto的红宝石编程语言第4.2节