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

Задание

Средне

Ты применяешь распродажу к списку цен. Дан hash prices (символ item => целое значение price).

Прочитай одну строку ввода: список items, для которых нужно применить скидку 50%, разделённый запятыми (совпадает с символами в hash по имени).

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

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

Для ввода bread,milk с hash по умолчанию результатом будет:

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