use*_*008 2 ruby lambda for-loop return
在Ruby 1.8(我的版本是1.8.7-72)中,这段代码:
foo = lambda do
for j in 1..2
return
end
end
foo.call
Run Code Online (Sandbox Code Playgroud)
崩溃与LocalJumpError:
test2.rb:3: unexpected return (LocalJumpError)
from test2.rb:2:in `each'
from test2.rb:2
from test2.rb:6:in `call'
from test2.rb:6
Run Code Online (Sandbox Code Playgroud)
为什么这样做?但是,它似乎在我的Ruby 1.9版本上运行良好.
编辑:这不仅仅是在lambda内部返回; 以下运行正常:
foo = lambda do
return
end
foo.call
Run Code Online (Sandbox Code Playgroud)
发生的事情是lambda中间的for语句被内部转换为块.在Ruby中,块内的返回语句的作用域是它们的封闭方法.考虑以下:
def bar
foo = lambda do
for j in 1..2
return j
end
end
foo[]
end
p bar
Run Code Online (Sandbox Code Playgroud)
在运行时bar,1返回,因为return它的范围是整个bar方法.要从块返回,您要使用next或break两者都采用参数.考虑:
def bar
foo = lambda do
for j in 1..2
break j
end
end
foo[] + 1
end
p bar
Run Code Online (Sandbox Code Playgroud)
此中断会从块返回,并阻止任何后续迭代.在这种情况下,调用bar将返回2,因为迭代器将返回1,foo[] + 1因此将返回2.
如果所有这些听起来令人困惑,那么要实现的主要内容是返回内部块的范围限定为周围方法,并且没有周围方法,LocalJumpError则引发a.
| 归档时间: |
|
| 查看次数: |
1167 次 |
| 最近记录: |