TOPLEVEL_BINDING 和绑定有什么区别?
What's the difference between TOPLEVEL_BINDING and binding?
我打开 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
我打开 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