为什么每次都创建不同的绑定对象?

时间:2014-04-28 05:03:06

标签: ruby local-variables

RDoc解释说

  

Binding的对象将执行上下文封装在代码中的某个特定位置,并保留此上下文以供将来使用。可以在此上下文中访问的self的变量,方法,值以及可能的迭代器块都将被保留。

为此目的,如果单个上下文具有唯一的绑定对象,那么它似乎是合理且有用的。但是,即使在完全相同的上下文中,每次连续创建绑定对象都会导致不同的对象:

binding # => #<Binding:0x007f29017cf8e0>
binding # => #<Binding:0x007f29017ccff0>
binding # => #<Binding:0x007f29017c8d38>

这是为什么?有什么比这个功能更方便吗?

我看到这个功能的一个不便之处在于,当我做一些依赖于当前上下文的事情时,除了明确引用绑定对象之外别无他法。 下面的最后两行返回错误,因为binding创建的绑定对象不是由创建的另一个绑定对象或隐式上下文共享。

b = binding
b.local_variable_set(:foo, "foo")

b.local_variable_get(:foo)       # => "foo"
binding.local_variable_get(:foo) # => error
foo                              # => error

1 个答案:

答案 0 :(得分:0)

请参阅Kernel#binding

  

返回一个Binding对象,描述调用点的变量和方法。

据我了解,Binding对象与您创建它的位置有关。因此binding可能无法检查上下文是否不同,只返回该的新绑定。如果您想要更深层次的东西,您可以查看MRI工具source/mri/proc.c#314