在此示例中,
def foo(x)
if(x > 5)
bar = 100
end
puts bar
end
然后foo(6)输出: 100,foo(3)不输出任何内容。
但是,如果我将定义更改为
def foo(x)
if(x > 5)
bar = 100
end
puts bob
end
我得到一个“未定义的局部变量或方法”错误。
所以我的问题是,当我调用foo(3)并且bar从未被设置时,为什么我没有得到这个错误?
发布于 2010-11-11 21:47:17
这里有几件事正在发生。首先,在if
块中声明的变量与在方法顶层声明的变量具有相同的局部作用域,这就是为什么bar
在if
之外可用。其次,你会得到这个错误,因为bob
是突然被引用的。Ruby解释器从未见过它,也从未见过它被初始化。但是,它以前在if语句中看到过bar
初始化。因此,当is获得bar时,它知道它的存在。把这两者结合起来,这就是你的答案。
发布于 2010-11-11 21:41:59
所以不要认为这是福音(因为它更多的是基于观察而不是理解),但是ruby解释器似乎会将等号左边的任何单词(前面没有符号)标记为本地单词。你的例子很奇怪,这就更奇怪了
def foo
bar = bar
puts bar // nil, which gets coerced into ""
end
我不知道它为什么工作,也不知道它是如何工作的,但你已经知道了。
发布于 2012-03-27 09:15:16
foo(3)
不会输出任何内容。它输出一个换行符。
使用inspect
会给你更多的提示:
def foo(x)
if(x > 5)
bar = 100
end
puts bar.inspect
end
foo(3)
打印输出
nil
bar
是一个完全成熟的变量,只是它的值恰好是nil
。
https://stackoverflow.com/questions/4154864
复制相似问题