我试图使用eval
在Ruby中动态创建局部变量,并改变局部变量数组。我在IRB这样做。
eval "t = 2"
local_variables # => [:_]
eval "t"
# => NameError: undefined local variable or method `t' for main:Object
local_variables << "t".to_sym # => [:_, :t]
t
# => NameError: undefined local variable or method `t' for main:Object
答案 0 :(得分:15)
您必须使用相同的绑定对象同步评估。否则,单个评估有其自己的范围。
b = binding
eval("t = 2", b)
eval("local_variables", b) #=> [:t, :b, :_]
eval("t", b) # => 2
b.eval('t') # => 2
答案 1 :(得分:10)
您必须使用正确的binding。例如,在IRB中,这将起作用:
irb(main):001:0> eval "t=2", IRB.conf[:MAIN_CONTEXT].workspace.binding
=> 2
irb(main):002:0> local_variables
=> [:t, :_]
irb(main):003:0> eval "t"
=> 2
irb(main):004:0> t
=> 2
答案 2 :(得分:8)
您可以像这样设置实例变量:
instance_variable_set(:@a, 2)
@a
#=> 2