Ruby可以从字符串创建变量吗?

Ruby可以从字符串创建变量吗?,ruby,Ruby,我知道我们可以求值一个字符串以获得一个现有变量,如下所示: foo = "foo" bar = "bar" %w{foo bar}.each do |baz| puts eval(baz) end => "foo", "bar" %w{foo bar}.each do |baz| instance_variable_set "@#{baz}", baz end puts @foo puts @bar 但是有可能做相反的事情吗,像这样 %w{foo bar}.each do |

我知道我们可以求值一个字符串以获得一个现有变量,如下所示:

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

puts @foo
puts @bar
但是有可能做相反的事情吗,像这样

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

我知道散列可以达到这个目的,但是对于几个变量来说,散列感觉像是一种过度杀戮。除了创建实例变量,还有更好的方法吗?

您可以使用如下实例变量:

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

puts @foo
puts @bar

但是,看起来您无法使用局部变量。

如果我猜对了,您希望获取一个字符串并将其用作setter

%w{foo bar}.each do |baz|
  send("#{baz}=", baz)
end
我本应该更加注意问题的标题。如果您确实想直接设置变量,那么原始答案是正确的

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

谢谢你的回答。我知道instance\u variable\u set方法。但是有没有办法只创建一个局部变量呢?我不认为%w{foo bar}。每个do | baz | eval#{baz}=#{baz}结束都有效……自v1.9以来,无法动态创建局部变量。在这之前,你可以用
eval
来实现。我认为即使在1.9之前,你也不能用eval创建新的局部变量,但是你可以写入已经在
eval
语句之外定义的现有变量。嘿@marwei,看看这篇文章:如果使用哈希也是一种滥杀,然后在循环中引入一些花哨的东西,这就更过分了。