从matz ruby​​切换到jruby时出现奇怪的`return`行为

为什么这个片段:

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

点赞