2016-02-06 31 views
-1

我知道我们可以EVAL一个字符串,得到这样一个现有的变量:Ruby可以从字符串创建变量吗?

foo = "foo" 
bar = "bar" 
%w{foo bar}.each do |baz| 
    puts eval(baz) 
end 
=> "foo", "bar" 

但有可能反其道而行之,这样的吗?

%w{foo bar}.each do |baz| 
    eval(baz) = baz 
end 

我知道的哈希会为目的的工作,但哈希感觉只是一对夫妇的变量矫枉过正。除了创建实例变量之外,还有更好的方法吗?

+1

你试过了吗? – Jon

+1

嘿@marwei,看看这个帖子:http://stackoverflow.com/questions/18552891/how-to-dynamically-create-a-local-variable –

+0

如果使用即使一个哈希是一个矫枉过正,然后引入一些幻想该循环更加矫枉过正。 – sawa

回答

0

您可以用实例变量这样做:

%w{foo bar}.each do |baz| 
    instance_variable_set "@#{baz}", baz 
end 

puts @foo 
puts @bar 

看起来你无法与局部变量做到这一点,虽然。

+0

感谢您的回答。我知道instance_variable_set方法。但是有没有办法创建一个局部变量?我不认为%w {foo bar} .each会做| baz | eval“#{baz} =#{baz}” end works ... – marwei

+1

从v1.9开始,我们无法动态创建局部变量。在此之前,你可以用'eval'来完成。 –

+0

我想即使在1.9之前,你也无法用eval创建新的本地变量,但是你可以写入已经在你的'eval'语句之外定义的现有变量。 – Jon

0

如果我猜对了,你想要一个字符串并将其用作setter。

%w{foo bar}.each do |baz| 
    send("#{baz}=", baz) 
end 

我应该更加关注问题的标题。如果你真的想直接设置变量,原始答案是正确的。

%w{foo bar}.each do |baz| 
    instance_variable_set("@#{baz}", baz) 
end 
相关问题