查看全局和局部变量

Kernel 公开了获取 global_variableslocal_variables 列表的方法 :

cats  = 42
$demo = "in progress"
p global_variables.sort
#=> [:$!, :$", :$$, :$&, :$', :$*, :$+, :$,, :$-0, :$-F, :$-I, :$-K, :$-W, :$-a,
#=>  :$-d, :$-i, :$-l, :$-p, :$-v, :$-w, :$., :$/, :$0, :$1, :$2, :$3, :$4, :$5,
#=>  :$6, :$7, :$8, :$9, :$:, :$;, :$<, :$=, :$>, :$?, :$@, :$DEBUG, :$FILENAME,
#=>  :$KCODE, :$LOADED_FEATURES, :$LOAD_PATH, :$PROGRAM_NAME, :$SAFE, :$VERBOSE,
#=>  :$\, :$_, :$`, :$binding, :$demo, :$stderr, :$stdin, :$stdout, :$~]

p local_variables
#=> [:cats]

与实例变量不同,没有专门用于获取,设置或删除全局变量或局部变量的方法。寻找这样的功能通常表明应该重写你的代码以使用 Hash 来存储值。但是,如果必须按名称修改全局或局部变量,则可以将 eval 与字符串一起使用:

var = "$demo"
eval(var)           #=> "in progress"
eval("#{var} = 17")
p $demo             #=> 17

默认情况下,eval 将评估当前范围内的变量。要评估不同范围内的局部变量,必须捕获局部变量所在的绑定

def local_variable_get(name, bound=nil)
  foo = :inside
  eval(name,bound)
end

def test_1
  foo = :outside
  p local_variable_get("foo")
end

def test_2
  foo = :outside
  p local_variable_get("foo",binding)
end
  
test_1 #=> :inside
test_2 #=> :outside

在上面,test_1 没有通过对 local_variable_get 的绑定,因此 eval 在该方法的上下文中执行,其中名为 foo 的局部变量被设置为:inside