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 }   # яблоко, хлеб, молоко

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

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

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

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

Задание

Средне

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

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

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

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

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

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

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

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

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

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

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

Потренируйтесь самостоятельно: Онлайн-компилятор Ruby