如何在Ruby中动态创建局部变量?
我试图使用如何在Ruby中动态创建局部变量?,ruby,irb,Ruby,Irb,我试图使用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: unde
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
eval“t=2”
局部变量#=>[:#]
评估“t”
#=>NameError:未定义的局部变量或main:Object的方法“t”
局部变量[:,:t]
T
#=>NameError:未定义的局部变量或main:Object的方法“t”
您必须将计算与同一绑定对象同步。否则,单个评估有其自己的范围
b = binding
eval("t = 2", b)
eval("local_variables", b) #=> [:t, :b, :_]
eval("t", b) # => 2
b.eval('t') # => 2
您可以这样设置实例变量:
instance_variable_set(:@a, 2)
@a
#=> 2
你必须使用正确的方法。例如,在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
你为什么要这么做?“目的是什么?”塞尔吉奥图兰采夫我问自己同样的问题。最有可能的是,原来的问题可以用一种更简单的方法来解决。问题不在于实例变量。这是真的,但也许这也可以解决OP的问题。正如我在对原始问题的评论中所说的,我希望一个更简单的解决方案对原始问题是可行的。另外,作为一种替代方法,请不要忘记
define\u method
。谢谢。如何获取主对象的绑定。每次运行b=binding;它会返回一个不同的绑定对象。@ppone:再说一遍,你想用它实现什么?他的意思是你为什么要动态设置局部变量。您的问题可能会以不同的方式得到解决,无需动态设置局部变量,最重要的是,无需使用eval
。我只是好奇为什么没有设置它。你可能是对的,有一种更有效的方法。找到这个问题的答案,有助于我更好地理解Ruby。关于如何在现有上下文/绑定中动态创建局部变量,我仍然看不到答案,因为binding
总是创建一个新的上下文。关于IRB呢ruby myfile.rb
?@SergioTulentsev我不确定,TOPLEVEL_BINDING
和ObjectSpace中的其他绑定实例似乎不起作用。