gpt4 book ai didi

Ruby Lambda 与 Proc LocalJumpError

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

Ruby 和 StackOverflow 新手在这里学习 Ruby 并遇到了我的第一个主要障碍。我真的很难全神贯注于 Procs 和 Lambdas。这是我正在使用的代码。

def procBuilder(message)
Proc.new{ puts message; return}
end

def test
puts "entering method"
p = procBuilder("entering proc")
p.call
puts "exit method"
end

test

按照设计,这是为了抛出 LocalJumpError,但我不明白为什么。如果我不得不猜测它做了什么,我猜它最初会在 p = procBuilder("entering proc") 运行时打印“entering proc”,然后在 p.call 上抛出错误,因为 p.call 没有传递任何字符串,但显然我遗漏了这两行之间发生的一些关键内容。我也不完全理解为什么这适用于 lambda 而不是 proc,但我想理解错误也会解决该问题。

预先感谢您的澄清

最佳答案

这是一个 answer我给了一个相关的问题。它谈到了 lambda 与 proc 和 LocalJumpErrors。

在过程中,return 是一段特殊的语法,它从过程的词法范围返回,而不是过程本身。所以它试图从已经退出的 procBuilder 中返回。

有几种方法可以解决这个问题:

  1. 根本不要使用return。 Ruby 将自行将控制权返回给 proc 的调用者。
  2. proc 更改为 lambda,它的行为符合您的预期。 Lambda 就像方法一样; procs 就像 block 一样。

至于您预期的错误,您不应该得到它。 procBuilder 返回包含消息变量的过程。您不需要 proc 本身的任何参数。

编辑:回答您的附加问题。 proc 是一个闭包。它已经“捕获”了消息变量(procBuilder 中的局部变量),该变量在创建 proc 时处于范围内。 proc 现在可以在你的程序中漫游,消息变量隐藏在它里面,准备好在你调用它时打印出来。唯一的麻烦是 return 语句,它有额外的要求,即词法范围仍然是“活的”。

所有这一切的原因是这种行为在 block 中确实很有帮助。在这种情况下,它根本没有帮助,所以您应该只使用 lambda,其中 return 意味着不那么疯狂。

关于 ruby​​ 闭包的非常棒的教程:http://innig.net/software/ruby/closures-in-ruby.rb

关于Ruby Lambda 与 Proc LocalJumpError,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8162831/

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