首页 > 解决方案 > 从另一个 lambda 调用一个 lambda。为什么顺序很重要?

问题描述

可以从另一个 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>'

即使:second似乎是范围内的局部变量first

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

我只将 lambdas 用于打高尔夫球的目的,所以我不确定范围是怎么回事。用方法或常量 lambda替换second可修复NameError. 它似乎与这个问题有关,但在我的情况下,两个 lambda 都是在main.

你能解释一下吗?

标签: rubylambdascope

解决方案


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”,因为信息是从绑定中检索的。

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


推荐阅读