TOPLEVEL_BINDING和绑定有什么区别?



我打开irb并检查了binding的值,并TOPLEVEL_binding

2.7.0 :021 > TOPLEVEL_BINDING
=> #<Binding:0x00007fbd7d85bb18>
2.7.0 :022 > binding
=> #<Binding:0x00007fbd7c2ce908>

我的理解是,新irb会话中的TOPLEVEL_bindingbinding应该都指向同一个对象:main执行上下文的绑定对象。它们为什么不同?

TOPLEVEL_BINDING

是一个常量。

binding是一种方法,用于创建特定于调用它的位置的新绑定。

> TOPLEVEL_BINDING #=> #<Binding:0x0000564e7226f1d0>
> TOPLEVEL_BINDING #=> #<Binding:0x0000564e7226f1d0> -- same object
> binding #=> #<Binding:0x0000564e72892aa8>
> binding #=> #<Binding:0x0000564e728907f8> -- new object
> TOPLEVEL_BINDING.source_location #=> ["<main>", 0]
> binding.source_location #=> ["(irb)", 6]
> binding == binding #=> false
> x = 2
> b = binding
> z = 4
> TOPLEVEL_BINDING.eval('x') #=> NameError
> TOPLEVEL_BINDING.eval('z') #=> NameError
> b.eval('x') #=> 2
> b.eval('z') #=> NameError
> binding.eval('x') #=> 2
> binding.eval('z') #=> 4

最新更新