Ruby动态变量名

时间:2013-05-07 13:02:35

标签: ruby

有没有办法在Ruby中使用动态名称创建变量?

我正在读取一个文件,当我找到一个字符串时,会生成一个哈希值。

e.g。

file = File.new("games.log", "r")

file.lines do |l|
  l.split do |p|
    if p[1] == "InitGame"
      Game_# = Hash.new
    end
  end
end

如何将Game_中的#更改为数字(Game_1,Game_2,...)

3 个答案:

答案 0 :(得分:37)

你可以使用像

这样的实例变量来实现
i = 0
file.lines do |l|
  l.split do |p|
    if p[1] == "InitGame"
      instance_variable_set("@Game_#{i += 1}", Hash.new)
    end
  end
end

但是你应该使用一个数组作为viraptor说。由于您似乎只有一个新的哈希作为值,它可以简单地

i = 0
file.lines do |l|
  l.split do |p|
    if p[1] == "InitGame"
      i += 1
    end
  end
end
Games = Array.new(i){{}}
Games[0] # => {}
Games[1] # => {}
...

答案 1 :(得分:9)

为什么要使用单独的变量?您似乎只希望Game成为每次都附加值的列表。然后,您可以使用Game[0]Game[1],...

来引用它们

答案 2 :(得分:0)

如果你真的想要动态变量名,可能你可以使用Hash,比你可以设置关键动态

file = File.new("games.log", "r")
lines = {}
i = 0

file.lines do |l|
  l.split do |p|
    if p[1] == "InitGame"
      lines[:"Game_#{i}"] = Hash.new
      i = i + 1
    end
  end
end