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会话的脚本。