Ruby的“绑定”是否与Scope Chain相同?

时间:2010-07-03 14:02:27

标签: ruby binding scope scope-chain

Ruby的eval()可以像

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

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

也可以传入绑定对象而不是块。绑定对象是否与讨论Javascript闭包时提到的“范围链”相同?

1 个答案:

答案 0 :(得分:2)

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

JS中的作用域链维护一个执行上下文列表(变量绑定等),当前执行范围的上下文位于链的一端,全局范围位于另一端。只要闭包可以访问,创建一个引用自由变量的闭包就必须保持上下文列表。

Ruby Binding对象的文档说:

  

Binding类的对象封装   一些执行上下文   代码中的特定位置和   保留此上下文以供将来使用。   变量,方法,自我价值,   并且可能是一个迭代器块   可以在这种情况下访问   全部保留。绑定对象可以   使用Kernel#binding创建,并且是   可用于回调   内核#set_trace_func。

     

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

我不太了解如何实现Binding的内部结构,但它似乎有同样的目的:存储上下文以供将来评估。