Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在Ruby中动态创建局部变量?_Ruby_Irb - Fatal编程技术网

如何在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中的其他绑定实例似乎不起作用。