gpt4 book ai didi

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

转载 作者:数据小太阳 更新时间:2023-10-29 07:35:57 24 4
gpt4 key购买 nike

为什么这个片段:

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

在 ruby​​ 2.0.0p481 (2014-05-08) [x64-mingw32]
中打印 2但 Java HotSpot(TM) 64 位服务器虚拟机上的 jruby 1.7.15 (1.9.3p392) 2014-09-03 82b5cc3 中的 1 1.7.0_67-b01 +jit [Windows 8-amd64]?

我想了解这个问题。

UPD:是否应该在某处报告?

最佳答案

我一直认为 block 内的 return 是未定义的行为。您可以使用 next 代替吗?

例如,Rubinius 也有这个问题,但更明确:

[1].map(&lambda { |n| return -1 })
LocalJumpError: unexpected return

当然,使用 next 会产生预期的结果:

rbx-head :003 > [1].map(&lambda { |n| next -1 })
=> [-1]

故事的寓意是 return 是为方法定义的,而 Procs 和 lambdas 不是方法。 nextbreak 是您希望停止 block 调用时使用的关键字。

我在官方 Ruby 规范中找不到关于 return 行为的任何文档,但是 rubyspec 确实有验证 return 的测试导致调用方法返回。

https://github.com/rubyspec/rubyspec/blob/master/language/return_spec.rb#L184

关于ruby - 从 matz ruby​​ 切换到 jruby 时出现奇怪的 `return` 行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25917119/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com