在这个例子中,
def foo(x)
if(x > 5)
bar = 100
end
puts bar
end
Run Code Online (Sandbox Code Playgroud)
然后foo(6)输出:100和foo(3)什么都不输出.
但是,如果我将定义更改为
def foo(x)
if(x > 5)
bar = 100
end
puts bob
end
Run Code Online (Sandbox Code Playgroud)
我得到一个"未定义的局部变量或方法"错误.
所以我的问题是为什么当我调用foo(3)并且从未设置bar时我没有收到此错误?
Tod*_*odd 55
这里发生了一些事情.首先,在if
块内声明的变量与在方法顶层声明的变量具有相同的局部作用域,这就是为什么bar
可以在if
.其次,你得到了这个错误,因为bob
它是直接引用的.Ruby解释器从未见过它,也从未见过它.但是,bar
在if语句中,它已经被初始化了.所以什么时候到吧,它知道它存在.结合这两个,这就是你的答案.
Jör*_*tag 15
你的第二个例子实际上是一个红色的鲱鱼:你得到一个例外的原因不是因为bob
它是未初始化的,而是因为它是模棱两可的.无法判断它是变量还是方法.
您的第一个示例有效,因为未初始化的局部变量(以及全局变量和实例变量)的计算结果为nil
.因此,puts bar
完全没问题:在一种情况下bar
初始化为100
并且这个评估为100
,在另一种情况下,它是未初始化的,因此评估为nil
.puts
调用to_s
它的参数,它被定义为nil
(它只返回空字符串),所以一切都很好,花花公子.
另见在Ruby中,为什么在启动irb之后,foo.nil?说未定义的错误,@ foo.nil?给出"真实"和@@ wah.nil?再次出错?
归档时间: |
|
查看次数: |
10011 次 |
最近记录: |