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

+0

クラス名またはモジュール名を宣言していない限り、大文字の変数名はRubyでは悪い習慣とみなされます。 'Game_'を' game_'に変更することを検討してください。 –

+1

これらの動的に作成された名前で何を*あなたはしますか?あなたのソースコードは、clunkyな 'send'を除いてそれらを参照できませんでした。私の配列のように見えます。 –

答えて

32

それらを参照することができます。あなたが値としてちょうど新しいハッシュを持っているように見えるので、それはあなたが設定することができるよりも、あなたはハッシュを使用することができますすることができ、あなたが本当に動的な変数名を使用する場合は、単に

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

ありがとうございます@さわ! –

+1

非常に興味深い。 – sidney

+0

詳細:http://ruby-doc.org/core-2.2.0/Object.html#method-i-instance_variable_get –

8

なぜ別々の変数を使うのか?毎回Gameに値が追加されたリストにしたいと思うようです。そして、あなたはあなたが

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が言うように、あなたは、配列を使用する必要があります...、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 
関連する問題