我打开irb
并检查了binding
的值,并TOPLEVEL_binding
:
2.7.0 :021 > TOPLEVEL_BINDING
=> #<Binding:0x00007fbd7d85bb18>
2.7.0 :022 > binding
=> #<Binding:0x00007fbd7c2ce908>
我的理解是,新irb
会话中的TOPLEVEL_binding
和binding
应该都指向同一个对象: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