Ruby Lambda与Proc LocalJumpError
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的调用者. 至于你期待的错误,你不应该这样做. procBuilder返回一个包含消息变量的proc.你不需要proc本身的任何参数. 编辑:回答您的其他问题. proc是一个闭包.它已“捕获”了消息变量(procBuilder中的局部变量),该变量在创建过程时处于范围内. proc现在可以浏览你的程序,其中隐藏了消息变量,准备好在你调用它时打印.唯一的麻烦就是return语句,它还要求词法范围仍然是“实时”. 所有这一切的原因是这种行为在块中真的很有用.在这种情况下,它根本没用,所以你应该只使用一个lambda,其中return意味着更少疯狂. 关于ruby闭包的一个非常好的教程:http://innig.net/software/ruby/closures-in-ruby.rb (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |