我想知道为什么我不能从这个街区返回:
[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]
希望有人能解释一下。
dhxwm5r41#
在Ruby中,你可以在块内使用return。它将从封闭方法返回。在这种情况下,没有封闭方法,这就是为什么会有错误,这不是因为块中的return是非法的
clj7thdc2#
在终端中打开ruby控制台(使用irb或rails console),然后键入return 10。
irb
rails 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一样。因此,如果在控制台中执行示例
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的示例
2条答案
按热度按时间dhxwm5r41#
在Ruby中,你可以在块内使用return。它将从封闭方法返回。在这种情况下,没有封闭方法,这就是为什么会有错误,这不是因为块中的return是非法的
clj7thdc2#
在终端中打开ruby控制台(使用
irb
或rails console
),然后键入return 10
。这是因为没有封闭方法。要使用
return
,您必须从某个位置返回。当您在Proc中使用
return
时,本质上就像从最上游的上下文中调用return
一样。因此,如果在控制台中执行示例
它基本上做的事情与键入
按钮关闭对话框.
你的其他例子实际上并不执行嵌套proc / lambda中的内容,这就是为什么没有错误的原因。
但如果调用proc,它将抛出相同的错误
lambda在本地上下文中返回,因此没有错误
这个answer有更多关于在proc或lambda中使用
return
的示例