TOPLEVEL_BINDING irb和脚本的区别

如果我把以下代码:

a = 42 p TOPLEVEL_BINDING.local_variable_defined?(:a) 

在一个文件“rubyScratch.rb”和ruby它使用

 ruby rubyScratch.rb 

我明白了

 true 

但是,我得到了

 2.3.1 :001 > a = 42 => 42 2.3.1 :002 > TOPLEVEL_BINDING.local_variable_defined?(:a) => false 

为什么会出现这种差异?

这是因为irb命令(在我的系统上,无论如何)运行一个小的ruby脚本,如下所示:

 #!/usr/bin/env ruby # # irb.rb - interactive ruby # $Release Version: 0.9.6 $ # $Revision: 40560 $ # by Keiju ISHITSUKA(keiju@ruby-lang.org) # require "irb" IRB.start(__FILE__) 

所以, TOPLEVEL_BINDING是这个脚本而不是你的IRB上下文。

在寻找更多信息时,我遇到了这篇简短的文章 :

正如其名称所示,它是脚本主要范围的绑定:

 a = 42 p binding.local_variable_defined?(:a) # => true p TOPLEVEL_BINDING.local_variable_defined?(:a) # => true def example_method p binding.local_variable_defined?(:a) # => false p TOPLEVEL_BINDING.local_variable_defined?(:a) # => true end example_method 

总而言之, TOPLEVEL_BINDING是Ruby VM运行的当前上下文中第一个脚本的binding 。 运行IRB时,该脚本是启动IRB会话的脚本。