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

ruby – 从另一个lambda调用lambda.为什么订单很重要?

发布时间:2020-12-17 03:43:06 所属栏目:百科 来源:网络整理
导读:可以从另一个lambda调用lambda: first = - { 'Ok' }second = - { first.call }puts second.call# = 'Ok' 但是当订单颠倒时: first = - { second.call }second = - { 'Ok' }puts first.call 代码失败并出现NameError: lambda_order.rb:1:in `block in main
可以从另一个lambda调用lambda:

first   = -> { 'Ok' }
second  = -> { first.call }
puts second.call
# => 'Ok'

但是当订单颠倒时:

first  = -> { second.call }
second = -> { 'Ok' }
puts first.call

代码失败并出现NameError:

lambda_order.rb:1:in `block in <main>': undefined local variable or method `second' for main:Object (NameError)
Did you mean?  send
    from lambda_order.rb:3:in `<main>'

即使:第二个似乎是第一个范围内的局部变量:

first  = -> { local_variables }
second = -> { 'Ok' }
p first.call
# => [:first,:second]

我只使用lambdas为golfing purposes,所以我不确定范围是怎么回事.用方法或常量lambda替换第二个修复了NameError.它似乎与这个question有关但在我的情况下,两个lambdas都是在main中定义的.

你能解释一下吗?

解决方法

first  = -> { defined? second }
second = -> { 'Ok' }
p first.call

结果nil =>变量“second”未在lambda“first”中定义.

first  = -> { binding.receiver }
second = -> { 'Ok' }
p first.call

结果main =>这意味着它使用main的当前绑定,因此变量“second”仅在binding中定义.

first  = -> { binding.local_variable_get(:second).call }
second = -> { 'Ok' }
p first.call

结果“好的”.这就是为什么当我要求绑定变量“second”的内容时,代码也打印“Ok”.

简介:变量“second”未在lambda“first”中定义.变量“second”仅在binding中定义.因此,“local_variables”的输出也返回“second”,因为从绑定中检索信息.

我自己也学到了一些东西.我希望我能帮到你!

(编辑:李大同)

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

    推荐文章
      热点阅读