查看全局和局部变量
Kernel
公开了获取 global_variables
和 local_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
。