2016-03-14 2 views
-3

Это мой код:рубин создания хэш для array.each

@games.each do |game| #@games is an array 
    #definitely working 
    game = Hash.new 0 
end 

И как вы можете догадаться ... это не работает. Нет ошибок. Просто таких переменных не существует. Я хочу, чтобы мои хэши вызывались по названию игр. Многое из этого, потому что есть 240 названий.

Я уверен, что я должен принять эту «игру = Hash.new 0» из блока, но, честно говоря, у меня нет никаких идей.

С уважением.

+1

Это поможет, если вы могли бы обеспечить входной образец массив с несколькими элементами, и желаемый результат. –

+2

Что должен делать ваш код? –

+0

Если честно, я не знаю, о чем вы просите, но позвольте мне попробовать и извинить за мою глупость. После одного метода я остаюсь с массивом, который выглядит так: [«steam», «age_of_Empires_II: _HD_Edition», «anomaly_Warzone_Earth», «bEEP», «bEEP», «bEEP», «blockstorm», «brütal_Legend»] и т. Д. (как я уже сказал, есть 240 названий). Как я уже сказал, я хочу, чтобы мои хеши вызывались из имени из этого массива. Например, один хеш будет «bEEP», второй - «blockstorm» и т. Д. –

ответ

1

переменная game содержит каждый элемент массива, прошел один за одним по each, так что вы должны попробовать это:

games_hash = {} 

@games.each do |game| 
    games_hash[game] = 0 
end 
+0

Я вижу, что он делает, но это не то, что я хотел. Я хотел создать новый Hash для каждой игры, поэтому я могу разместить дополнительную информацию (ключи) об этом, например. «монеты», «учетные записи», «how_many_friends_i_have_there». Было бы беспорядок, если бы я добавил 240 игр в один хэш и попытался добавить 5-кратную информацию для каждой игры. –

+0

Использовать хэш хэшей, как правило, вы бы достигли этого.Для лучшего ответа я предлагаю вам предоставить еще один код (даже если это не «реальный» код, просто то, что мы можем почувствовать), который показывает, как вы хотите использовать структуру данных, которую вы создаете. –

+0

Я думал о многоуровневых хэшах и думал, что это плохая идея ... теперь я делаю это с вашим сообщением как «руководство», и это очень просто. Теперь я даже не понимаю, почему я хотел сделать все эти переменные многоуровневыми хэшами. –

0

Вы можете использовать each_with_object.

games_hash = @games.each_with_object({}) do |game, hash| 
    hash[game] = 0 
end 

Вы также можете инициализировать хэш с 0.

games_hash = @games.each_with_object(Hash.new(0)) do |game, hash| 
    hash[game] 
end 
0

Это проблема ссылок:

Внутри each блока переменная game является ссылкой на игру, но это не сама игра.

Когда вы назначаете новый экземпляр game i.e .: ('game = Hash.new'), вы меняете значение этой ссылки. Теперь game не указывает на одну из игр в массиве, но теперь он указывает на новый хэш.

Я не уверен, если это то, что вы хотите, с помощью попробовать это:

games_hash = {} 
@games.each do |game| 
    games_hash[game] = {} 
end 
Смежные вопросы