2017-01-24 5 views
0

к переменному, у меня есть хэш хэш массивов:Ruby: помещает значение и имя

hash = Hash.new do |hash, key| 
    hash[key] = Hash.new do |hash, key| 
     hash[key] = Array.new 
    end 
end 

У меня также есть цикл, который получает значение от 3-х переменных:

author = gets.chomp 
file = gets.chomp 
time = Time.now 

Этих 3 переменных соответствуют 3 поколениям моего хэша: автор является переменной первого поколения и равен хешу; file - это переменная второго поколения и равна массиву; время - это переменная третьего поколения и равна простому значению.

Это, как я намеревался присвоить значения хэш:

hash[author][file] = file 
hash[author][file].push(time) 

Моя проблема заключается в том, что когда я хочу, чтобы реализовать автора и файл в хэш, я думаю, что я разрушаю второе поколение хэш или массив и установить переменную равной простому значению вместо:

hash[author][file] = file  #here, instead of adding a new key in the 2nd generation hash, I replace the hash with a single value. 
hash[author][file].push(time) #the "file" variable isn't an array anymore, it is a string, so I can't push anything in it. 

Могу ли я сделать что-то вроде проталкивая значение в хэш, поэтому он становится ключом?

Если нет, то как я могу что-то, что дало бы мне этот результат:

КОД:

hash = {1 => {"a1" => ["un", "uno"], "a2" => ["uunn", "uunnoo"]}, 2 => {"b1" => ["deux", "dos"], "b2" => ["ddeuxx", "ddooss"]}} 

hash.each do |key, value| 
    puts key 
    value.each do |key, value| 
     puts key 
     value.each do |value| 
      puts value 
     end 
    end 
end 

РЕЗУЛЬТАТ:

1 
a1 
un 
uno 
a2 
uunn 
uunnoo 
2 
b1 
deux 
dos 
b2 
ddeuxx 
ddooss 
+0

Что искать ваши входные данные как? Вы не «нажимаете» значения в хеши, вы просто назначаете их. – tadman

+0

Я добавлю это к сообщению – nounoursnoir

+0

Это похоже на хороший кандидат для пользовательского класса или Struct. Сложные структуры данных с использованием примитивов, таких как хеши и массивы, теперь являются рецептом головных болей и основными головными болями. – moveson

ответ

1

Вместо того, установив значение строки здесь :

hash[author][file] = file 

Вы можете установить строку как значение ключа:

hash[author][file][:file] = file 

И пусть тогда массив будет еще одно свойство

hash[author][file][:times] ||= [] 
hash[author][file][:times].push time 
+0

Я думаю, что я понял об этом || =, что это то, что создает значение для переменной, у которой нет или уже есть, что означало бы, что хэш-ключ может иметь 2 (или более) значения вместо 1, am Я прав? Если нет, то я не понимаю весь ваш комментарий. Странно, я попытался использовать || =, полностью слепо, и ... мой код отлично работал, как-то! Я понятия не имел, что с ним случилось. – nounoursnoir

+0

if 'hash [author] [file]' - пустой хэш, тогда доступ к '[: times]' будет равен нулю. '|| =' устанавливает его значение _ только, если оно в настоящее время не определено или false_.Таким образом, вы можете вызывать '|| = столько раз, сколько хотите, не удаляя элементы, которые вы сохранили в массиве. Ключом здесь являются вложенные структуры данных. –