Menu
Coddy logo textTech

Итерация по хешам

Часть раздела Логика и управление потоком путешествия по Ruby на Coddy — урок 34 из 56.

Хеши являются перечисляемыми, поэтому вы можете перебирать их точно так же, как массивы. Существует три распространенных шаблона в зависимости от того, что вам нужно.

each передает вам и ключ, и значение:

prices = { apple: 1, bread: 3, milk: 4 }
prices.each do |item, price|
  puts "#{item}: $#{price}"
end

each_key перебирает только ключи:

prices.each_key { |k| puts k }   # apple, bread, milk

each_value перебирает только значения:

prices.each_value { |v| puts v }   # 1, 3, 4

И каждый метод Enumerable, который вы видели в прошлой главе, map, select, reduce: также работает с хешами. Вы просто получаете пару ключ/значение (или массив из 2 элементов) на каждой итерации:

prices.select { |item, price| price > 2 }
# {bread: 3, milk: 4}
challenge icon

Задание

Средне

Вы применяете распродажу к прайс-листу. Дан хеш prices (символ товара => целое число цены).

Прочитайте одну строку ввода: список через запятую товаров, на которые действует скидка 50% (соответствующих символам в хеше по имени).

Выведите в следующем порядке:

  1. По одной строке на каждый товар в формате <item>: <item>: $<final_price>lt;final_price>, где итоговая цена — это цена со скидкой, если товар есть в списке скидок, или исходная цена в противном случае. Используйте each для итерации. Товары сохраняют свой исходный порядок. Используйте целочисленное деление для расчета скидки (price / 2).
  2. Was: Was: $<n>lt;n>: исходная общая сумма (используйте values.sum)
  3. Now: Now: $<n>lt;n>: общая сумма после применения скидок
  4. Названия товаров, чья итоговая цена по-прежнему выше 2, через запятую с пробелом , (используйте select + keys для нового хеша)

Для ввода bread,milk с хешем по умолчанию вывод будет следующим:

apple: $1
bread: $1
milk: $2
cheese: $6
Was: $14
Now: $10
cheese

Шпаргалка

Итерация по хешам с помощью each, each_key, each_value:

prices = { apple: 1, bread: 3, milk: 4 }

prices.each { |item, price| puts "#{item}: $#{price}" }
prices.each_key { |k| puts k }
prices.each_value { |v| puts v }

Методы Enumerable, такие как map, select и reduce, также работают с хешами, получая пару ключ/значение на каждой итерации:

prices.select { |item, price| price > 2 }
# { bread: 3, milk: 4 }

Полезные методы хешей: .values.sum для суммирования всех значений, .keys для получения массива ключей.

Попробуйте сами

prices = { apple: 1, bread: 3, milk: 4, cheese: 6 }
discount = gets.chomp.split(",").map(&:to_sym)

# TODO: создать хеш итоговых цен через each; вывести строки, итоги, дорогие товары
quiz iconПроверьте себя

В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.

Все уроки раздела Логика и управление потоком