加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

Ruby Lambda与Proc LocalJumpError

发布时间:2020-12-17 02:30:31 所属栏目:百科 来源:网络整理
导读:Ruby和StackOverflow在这里通过Ruby工作,遇到了我的第一个主要障碍.我很难把头包裹在Procs和Lambdas身边.这是我正在使用的代码. def procBuilder(message) Proc.new{ puts message; return}enddef test puts "entering method" p = procBuilder("entering pr
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(“进入proc”)上打印“进入proc”然后在p.call上抛出一个错误,因为p.call没有传递任何字符串,但显然我错过了这两行之间发生的关键事件.我也不完全理解为什么这适用于lambda而不是proc,但是我想象理解错误也会解决这个问题.

在此先感谢您的澄清

解决方法

这是我给相关问题的 answer.它讨论了lambda vs proc和LocalJumpErrors.

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

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

>根本不要使用退货. Ruby将自己的控制权返回给proc的调用者.
>将proc更改为lambda,其行为与您期望的方式相同. Lambdas就像方法一样; procs就像块一样.

至于你期待的错误,你不应该这样做. procBuilder返回一个包含消息变量的proc.你不需要proc本身的任何参数.

编辑:回答您的其他问题. proc是一个闭包.它已“捕获”了消息变量(procBuilder中的局部变量),该变量在创建过程时处于范围内. proc现在可以浏览你的程序,其中隐藏了消息变量,准备好在你调用它时打印.唯一的麻烦就是return语句,它还要求词法范围仍然是“实时”.

所有这一切的原因是这种行为在块中真的很有用.在这种情况下,它根本没用,所以你应该只使用一个lambda,其中return意味着更少疯狂.

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读