ruby 本地跳转错误:意外回报

7kqas0il  于 2022-11-29  发布在  Ruby
关注(0)|答案(2)|浏览(140)

我想知道为什么我不能从这个街区返回:

[1,2].each { |e| return e } # => LocalJumpError: unexpected return

当这些工作时:

[1,2].each { |e| Proc.new {return e} } # => [1, 2]
[1,2].each { |e| lambda {return e} } # => [1, 2]

希望有人能解释一下。

dhxwm5r4

dhxwm5r41#

在Ruby中,你可以在块内使用return。它将从封闭方法返回。在这种情况下,没有封闭方法,这就是为什么会有错误,这不是因为块中的return是非法的

clj7thdc

clj7thdc2#

在终端中打开ruby控制台(使用irbrails console),然后键入return 10

2.6.9 :020 > return 10
Traceback (most recent call last):
        2: from (irb):20
        1: from (irb):20:in `rescue in irb_binding'
LocalJumpError (unexpected return)

这是因为没有封闭方法。要使用return,您必须从某个位置返回。
当您在Proc中使用return时,本质上就像从最上游的上下文中调用return一样。
因此,如果在控制台中执行示例

[1,2].each { |e| return e }

它基本上做的事情与键入

return 1
return 2

按钮关闭对话框.
你的其他例子实际上并不执行嵌套proc / lambda中的内容,这就是为什么没有错误的原因。
但如果调用proc,它将抛出相同的错误

[1,2].each { |e| Proc.new { return e }.call } # => LocalJumpError (unexpected return)

lambda在本地上下文中返回,因此没有错误

[1,2].each { |e| lambda { return e }.call } # => [1, 2]

这个answer有更多关于在proc或lambda中使用return的示例

相关问题