ruby - 从另一个 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
.
你能解释一下吗?
解决方案
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”,因为信息是从绑定中检索的。
我自己也学到了一些东西。我希望我能帮助你!
推荐阅读
- google-cloud-platform - GCP 实例组自动扩展意外工作
- html - Angular 2+ - 定期刷新显示的持续时间
- python-3.x - 如何正确地将 XML 标签内容修改反馈给 BeautifulSoup?
- phpstorm - 更改 PhpStorm 中搜索替换框的默认大小
- node.js - nginx反向代理还是nodejs fetch?
- ios - 扩展 UIViewController(s) 以显示 UIAlertController 而无需子类化
- c# - 我可以在 .cshtml 中为 SelectListItem 指定默认值吗?
- python - django ModelForm 额外字段
- numpy - 从相对旋转矩阵计算绝对旋转矩阵
- reactjs - Redux Form/Material UI 表单 - 发送二进制文件到服务器