2

Ruby的eval()可以像

def showblock(&block)
  puts eval("i * 3", block)
end

其中 block 是传递给函数的块。

除了块之外,还可以传入绑定对象。绑定对象是否与讨论 Javascript 闭包时经常提到的“作用域链”相同?

4

1 回答 1

2

经过一番研究,我会说是的,它们似乎是相关的概念。

JS 中的作用域链维护一个执行上下文列表(变量绑定等),当前执行作用域的上下文在链的一端,而全局作用域在另一端。创建引用自由变量的闭包需要保留该上下文列表,只要该闭包是可访问的。

Ruby Binding 对象的文档说:

Binding 类的对象将执行上下文封装在代码中的某个特定位置,并保留此上下文以供将来使用。变量、方法、self 的值,以及可能在此上下文中可以访问的迭代器块都被保留。绑定对象可以使用 Kernel#binding 创建,并且可用于 Kernel#set_trace_func 的回调。

这些绑定对象可以作为 Kernel#eval 方法的第二个参数传递,为评估建立环境。

我不太了解 Binding 的内部实现方式,但它似乎具有相同的目的:存储上下文以供将来评估。

于 2010-07-21T03:52:46.517 回答