Ruby的eval()
可以像
def showblock(&block)
puts eval("i * 3", block)
end
其中block是传递给函数的块。
也可以传入绑定对象而不是块。绑定对象是否与讨论Javascript闭包时提到的“范围链”相同?
答案 0 :(得分:2)
经过一番研究,我会说是的,它们似乎是相关的概念。
JS中的作用域链维护一个执行上下文列表(变量绑定等),当前执行范围的上下文位于链的一端,全局范围位于另一端。只要闭包可以访问,创建一个引用自由变量的闭包就必须保持上下文列表。
Ruby Binding对象的文档说:
Binding类的对象封装 一些执行上下文 代码中的特定位置和 保留此上下文以供将来使用。 变量,方法,自我价值, 并且可能是一个迭代器块 可以在这种情况下访问 全部保留。绑定对象可以 使用Kernel#binding创建,并且是 可用于回调 内核#set_trace_func。
这些绑定对象可以作为传递 内核#eval的第二个参数 方法,建立环境 评估。
我不太了解如何实现Binding的内部结构,但它似乎有同样的目的:存储上下文以供将来评估。