2013-05-07 21 views
22

C'è un modo per creare variabili in Ruby con nomi dinamici?Nome variabile dinamico Ruby

Sto leggendo un file e quando trovo una stringa, genera un hash.

ad es.

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

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

Come potrei cambiare # a # Game_ ai numeri (Game_1, Game_2, ...)

+0

Da dove vengono i numeri? – sawa

+0

Un nome di variabile con una lettera maiuscola è considerato una cattiva pratica in Ruby a meno che non si dichiari un nome di classe o modulo. Considera di cambiare 'Game_' in' game_'. –

+1

Cosa faresti * * * con quei nomi creati dinamicamente? Il tuo codice sorgente non può riferirsi a loro se non tramite 'send's clunky. Sembra un array per me. –

risposta

32

si può fare con le variabili di istanza come

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 

ma si consiglia di utilizzare un array come viraptor dice. Dal momento che ti sembra di avere solo un nuovo hash come il valore, può essere semplicemente

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

Grazie mille @sawa! –

+1

molto interessante. – sidney

+0

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

8

Perché utilizzare le variabili separate? Sembra che tu voglia solo che Game sia una lista con i valori aggiunti ogni volta. Poi si può fare riferimento con Game[0], Game[1], ...

0

Se si vuole veramente i nomi delle variabili dinamiche, può essere che si può usare un hash, che il vostro possibile impostare la chiave dinamica

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