TOPLEVEL_BINDING 和绑定有什么区别?

What's the difference between TOPLEVEL_BINDING and binding?

我打开 irb 并检查了 bindingTOPLEVEL_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