Обновить значения в хэше - PullRequest
       32

Обновить значения в хэше

0 голосов
/ 19 декабря 2018

Я пытаюсь обновить значения моего хэша после вычитания значений на три.Например,

extinct_animals = {
  "Passenger Pigeon" => 1914,
  "Tasmanian Tiger" => 1936,
  "Eastern Hare Wallaby" => 1890,
  "Dodo" => 1662,
  "Pyrenean Ibex" => 2000,
  "West African Black Rhinoceros" => 2011,
  "Laysan Crake" => 1923
}

У меня есть этот код, который устанавливает значения для вычитания трех:

extinct_animals.each {|animal, year| puts year - 3}

и вывод:

1911
1933
1887
1659
1920

Как мневернуть весь хеш с ключами и новыми значениями?

Ответы [ 2 ]

0 голосов
/ 19 декабря 2018

Вы захотите использовать Hash # transform_values! , дебютировавший в MRI v2.4:

extinct_animals.transform_values! { |v| v - 3 }
  #=> {"Passenger Pigeon"=>1911, "Tasmanian Tiger"=>1933,
  #    "Eastern Hare Wallaby"=>1887, "Dodo"=>1659, "Pyrenean Ibex"=>1997,
  #    "West African Black Rhinoceros"=>2008, "Laysan Crake"=>1920}

extinct_animals
  #=> {"Passenger Pigeon"=>1911, "Tasmanian Tiger"=>1933,
  #    "Eastern Hare Wallaby"=>1887, "Dodo"=>1659, "Pyrenean Ibex"=>1997,
  #    "West African Black Rhinoceros"=>2008, "Laysan Crake"=>1920}
0 голосов
/ 19 декабря 2018

Внутри блока убедитесь, что вы изменяете хеш с помощью =:

extinct_animals.each { |animal, year| extinct_animals[animal] = year - 3 }
=> {
  "Passenger Pigeon" => 1911,
  "Tasmanian Tiger" => 1933,
  "Eastern Hare Wallaby" => 1887,
  "Dodo" => 1659,
  "Pyrenean Ibex" => 1997,
  "West African Black Rhinoceros" => 2008,
  "Laysan Crake" => 1920
}

Не используйте puts.Это просто записывает в консоль.

Более краткая версия этого решения будет:

extinct_animals.each { |animal, _year| extinct_animals[animal] -= 3 }

Здесь мы добавляем префикс year с подчеркиванием, чтобы указать, что переменная не используетсяв пределах блока.

...