Ruby: Какой самый простой способ обновить значения Hash? - PullRequest
44 голосов
/ 07 марта 2011

Скажите:

h = { 1 => 10, 2 => 20, 5 => 70, 8 => 90, 4 => 34 }

Я хотел бы изменить каждое значение v на foo(v), чтобы h было:

h = { 1 => foo(10), 2 => foo(20), 5 => foo(70), 8 => foo(90), 4 => foo(34) }

Что такоесамый элегантный способ добиться этого?

Ответы [ 5 ]

104 голосов
/ 07 марта 2011

Вы можете использовать update (псевдоним merge!), чтобы обновить каждое значение, используя блок:

hash.update(hash) { |key, value| value * 2 }

Обратите внимание, что мы эффективно объединяем hash с самим собой. Это необходимо, потому что Ruby вызовет блок для разрешения слияния для любых конфликтующих ключей, установив значение с возвращаемым значением блока.

12 голосов
/ 27 сентября 2016

Рельсы добавлены transform_values(), так что теперь вы можете сделать {a:1, b:2, c:3}.transform_values{|v| foo(v)}

http://api.rubyonrails.org/classes/Hash.html#method-i-transform_values

7 голосов
/ 07 марта 2011

Это будет делать:

h.each {|k, v| h[k] = foo(v)}
5 голосов
/ 07 марта 2011

Следующее немного быстрее, чем @Dan Cheail для больших хэшей, и немного более функционально:массив пар в хеш.

0 голосов
/ 07 марта 2011

Есть несколько способов сделать это;самый простой способ - использовать Hash#each для обновления нового хеша:

new_hash = {}
old_hash.each do |key, value|
  new_hash[key] = foo(value)
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...