gpt4 book ai didi

ruby block 并从 block 中返回一些东西

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

我正在使用 ruby​​ 1.8.7。

p = lambda { return 10;}
def lab(block)
puts 'before'
puts block.call
puts 'after'
end
lab p

以上代码输出为

before
10
after

我将相同的代码重构到这里

def lab(&block)
puts 'before'
puts block.call
puts 'after'
end
lab { return 10; }

现在我收到 LocalJumpError:意外返回。

对我来说,这两个代码都在做同样的事情。是的,在第一种情况下我传递了一个过程,在第二种情况下我传递了一个 block 。但是 &block 将该 block 转换为 proc。所以 proc.call 应该表现相同。

是的,我看过这篇文章 Using 'return' in a Ruby block

最佳答案

当您使用 & 传入 block 时,您正在将它转换为一个过程。重要的一点是 proc 和 lambda 是不同的(lambda 实际上是 proc 的子类),特别是它们处理返回的方式。

所以你的重构代码实际上等同于:

p = Proc.new { return 10;}
def lab(block)
puts 'before'
puts block.call
puts 'after'
end
lab p

它还会生成 LocalJumpError。

原因如下:proc 的返回从其词法范围返回,但 lambda 返回到其执行范围。因此,虽然 lambda 返回到 lab,但传递给它的 proc 返回到声明它的外部范围。本地跳转错误意味着它无处可去,因为没有封闭函数。

The Ruby Programming Language说得最好:

Procs have block-like behavior and lambdas have method-like behavior

您只需跟踪您在何处使用的内容。正如其他人所建议的那样,您需要做的就是从您的 block 中删除 return,一切都会按预期进行。

关于 ruby block 并从 block 中返回一些东西,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2836495/

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