2013-05-07 170 views
22

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

我在读一个文件,当我找到一个字符串时,生成一个散列。

例如

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,...)

+0

数字从哪里来? – sawa 2013-05-07 13:04:14

+0

除非声明一个类或模块名称,否则在Ruby中,带有大写字母的变量名被认为是不好的做法。考虑将'Game_'改为'game_'。 – 2013-05-07 13:05:18

+1

你会用这些动态创建的名字做什么?您的源代码无法引用它们,除非通过笨重的“发送”。看起来像一个阵列给我。 – 2013-05-07 13:18:26

回答

32

你可以用实例变量不喜欢它

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

非常感谢你@sawa! – 2013-05-07 13:35:17

+1

很有意思。 – sidney 2013-11-27 17:24:36

+0

更多信息:http://ruby-doc.org/core-2.2.0/Object.html#method-i-instance_variable_get – 2015-01-25 00:54:10

8

为什么要使用不同的变量?看起来你只是想让Game成为每次都附加值的列表。然后你可以用Game[0]Game[1]引用它们,...

0

如果你真的想动态的变量名,可能是你可以使用哈希,比你可以设置按键动态

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