2013-05-07 167 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