考虑它的一个好方法是绑定是封装上下文的对象。binding
您可以使用关键字显示绑定对象:
a = 10 # a is defined in the 'main' context
def get_binding # so is the 'get_binding' method
b = 20
binding
end
n = get_binding #=> #<Binding:0x00...>
现在由于get_binding
在main
上下文中定义,返回的绑定对象包括方法的本地上下文以及主上下文中的任何内容。该变量b
在 中不可用main
,而在a
中可用get_binding
。
您可以通过使用以下方式与绑定对象交互来证明这一点eval
:
a #=> 10
eval('a', n) #=> undefined local variable or method 'a' for main:Object
b #=> undefined local variable or method `b' for main:Object
eval('b', n) #=> 20 # but it is defined within the context the n binding was created.
只是为了澄清 - 这个例子只是揭示了幕后发生的事情。如果有的话,您很少需要直接处理绑定对象。
Ruby 模块、类和方法显示它们与层次结构比它们更低的对象的绑定,但不是相反,除非它们通过公共实例方法等显式显示。这有点过于简单化了,但事实并非如此如果您是编程新手,有必要深入了解这一点。