Menu
Coddy logo textTech

Hash.new со значениями по умолчанию

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

По умолчанию поиск отсутствующего ключа в хеше возвращает nil:

scores = {}
puts scores["Alice"]   # nil

Hash.new(default) это меняет. Каждый отсутствующий ключ возвращает переданное вами значение:

scores = Hash.new(0)
puts scores["Alice"]   # 0

Это самый чистый способ написать счётчик. Перед увеличением значения не нужно проверять if scores[name].nil?:

counts = Hash.new(0)
["a", "b", "a", "c", "a"].each do |letter|
  counts[letter] += 1
end
puts counts.inspect   # {"a"=>3, "b"=>1, "c"=>1}

Важно: Hash.new(0) устанавливает значение по умолчанию равным 0, но не сохраняет ключ, когда вы его читаете. Хеш остаётся пустым, пока вы не выполните присваивание. Поэтому после того, как вы напишете counts[letter] += 1, ключ добавляется с новым значением.

challenge icon

Задание

Легко

Прочитайте список записей category:amount, разделённых запятыми (например, food:12,gas:30,food:8,books:25,gas:15). Создайте хеш с итогами по категориям с помощью Hash.new(0), затем выведите только те категории, итог для которых не меньше 20, по одной в строке, отсортированные по итогу в порядке убывания:

<category>: <total>

Для приведённого выше примера входных данных вывод будет таким:

gas: 45
books: 25
food: 20

Если ни одна категория не достигает 20, ничего не выводите.

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

entries = gets.chomp.split(",")

# TODO: totals = Hash.new(0); накапливать сумму по категориям;
#       затем вывести категории с total >= 20, отсортированные по total по убыванию
quiz iconПроверьте себя

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

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

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