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