我正在使用红宝石 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 将该块转换为 proc。所以 proc.call 的行为应该是相同的。
是的,我看过这篇文章在 Ruby 块中使用“return” https://stackoverflow.com/questions/2325471/using-return-in-a-ruby-block
当您使用 & 传递块时,您将其转换为过程。重要的一点是proc 和 lambda 是不同的(lambda 实际上是 proc 的子类),特别是它们如何处理 return。
所以你的重构代码实际上相当于:
p = Proc.new { return 10;}
def lab(block)
puts 'before'
puts block.call
puts 'after'
end
lab p
它还会生成 LocalJumpError。
原因如下: proc 的 return 从其词法作用域返回,而 lambda 返回其执行作用域。因此,尽管 lambda 返回为lab
,传递给它的 proc 返回到声明它的外部作用域。本地跳转错误意味着它无处可去,因为没有封闭函数。
Ruby 编程语言 http://oreilly.com/catalog/9780596516178说得最好:
Proc 具有类似块的行为,而 lambda 具有类似方法的行为
您只需要跟踪您在哪里使用什么。正如其他人所建议的,您所需要做的就是放弃return
从你的街区开始,事情就会按预期进行。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)