为什么这个片段:
def dump_dump
get_dump = lambda do
return 1 if $n
$n = true
module_exec &get_dump
2
end
p get_dump[]
end
Module.new do
module_exec &method(:dump_dump)
end
打印2 in ruby 2.0.0p481(2014-05-08)[x64-mingw32]
但在Java HotSpot(TM)64位服务器VM上的jruby 1.7.15(1.9.3p392)2014-09-03 82b5cc3中有1个
1.7.0_67-b01 jit [Windows 8-amd64]?
我想了解这个问题.
UPD:应该在某处报道吗?
最佳答案 我一直认为在一个区块内的返回是未定义的行为.你能用下一个吗?
例如,Rubinius也有这个问题,但更明确:
[1].map(&lambda { |n| return -1 })
LocalJumpError: unexpected return
当然,使用next会产生预期的结果:
rbx-head :003 > [1].map(&lambda { |n| next -1 })
=> [-1]
故事的寓意是回归是为方法定义的,而Proc和lambdas不是方法.如果您希望停止块调用,则next和break是要使用的关键字.
我从官方Ruby规范中找不到任何关于return行为的文档,但是rubyspec确实有测试验证返回导致调用方法返回.
https://github.com/rubyspec/rubyspec/blob/master/language/return_spec.rb#L184