2013-05-07 9 views
22

Czy istnieje sposób na tworzenie zmiennych w Ruby z nazwami dynamicznymi?Zmienna dynamiczna nazwa Ruby

Czytam plik i kiedy znajdę ciąg, generuje hash.

np.

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

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

Jak mogę zmienić w Game_ # # do liczb (Game_1, Game_2, ...)

+0

Skąd się biorą te liczby? – sawa

+0

Nazwa zmiennej z wielką literą jest uważana za złą praktykę w Ruby, chyba że deklarujesz nazwę klasy lub modułu. Rozważ zmianę 'Game_' na' game_'. –

+1

Co byś zrobił * z tymi dynamicznie tworzonymi nazwami? Twój kod źródłowy nie mógł się do nich odwoływać, z wyjątkiem za pomocą "niedziałających". Wygląda jak tablica do mnie. –

Odpowiedz

32

Można to zrobić z zmiennych instancji jak

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 

ale należy użyć tablicę jak mówi viraptor. Ponieważ wydaje się, że tylko nowy hash jako wartość, może to być po prostu

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

Dziękuję bardzo @sawa! –

+1

bardzo interesujące. – sidney

+0

Więcej informacji: http://ruby-doc.org/core-2.2.0/Object.html#method-i-instance_variable_get –

8

Dlaczego używać oddzielnych zmienne? Wygląda na to, że chcesz tylko, aby Game była listą z wartościami dodanymi do niej za każdym razem. Następnie można odwoływać się do nich z Game[0], Game[1] ...

0

Jeśli naprawdę chcesz dynamicznych nazw zmiennych, może być można użyć Hash, niż można ustawić klucz dynamiczny

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 
Powiązane problemy