Menu
Coddy logo textTech

Вложенные хэши

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

Значением хеша сам по себе может быть хеш. Такая вложенная структура — типичный способ представления структурированных записей в коде Ruby: один хеш с ключами в виде идентификаторов (или имён), где каждое значение содержит собственные поля:

students = {
  "Alice" => { age: 20, grade: "A" },
  "Bob"   => { age: 22, grade: "B" }
}

Чтобы получить вложенное значение, объедините lookups в цепочку:

puts students["Alice"][:age]    # 20
puts students["Bob"][:grade]    # B

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

students["Alice"][:major] = "Math"
puts students["Alice"]
# {age: 20, grade: "A", major: "Math"}

Чтобы безопасно читать данные из вложенного хеша, в котором на любом уровне может отсутствовать ключ, dig проходит по цепочке и возвращает nil, если какой-либо элемент на этом пути отсутствует:

students.dig("Alice", :grade)   # "A"
students.dig("Cara",  :grade)   # nil
challenge icon

Задание

Средне

Дан вложенный хеш inventory: каждый ключ верхнего уровня — это отдел, каждый внутренний ключ — это item, а каждое внутреннее значение — количество на складе (целое число).

Прочитайте одну строку ввода: разделённый запятыми список путей поиска department/item.

Для каждого пути по порядку используйте dig, чтобы разрешить его. Выведите одно из следующего:

  • <department>/<item>: <qty>, если путь существует
  • <department>/<item>: missing, если dig возвращает nil

После вывода каждой строки также выведите одну итоговую строку:

Total inventory: <sum>

Итоговое значение — это сумма каждого количества во всех отделах исходного хеша. Используйте вложенную итерацию (each отдел, затем каждый item).

Для ввода fruits/apples,meat/beef,fruits/dragonfruit,dairy/milk вывод будет таким:

fruits/apples: 12
meat/beef: 7
fruits/dragonfruit: missing
dairy/milk: 9
Total inventory: 39

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

inventory = {
  fruits: { apples: 12, bananas: 4 },
  meat:   { beef: 7, chicken: 5 },
  dairy:  { milk: 9, cheese: 2 }
}
lookups = gets.chomp.split(",")

# TODO: для каждого lookup выполни dig и выведи qty или 'missing'.
#       Then print 'Total inventory: <sum>' across all items.
quiz iconПроверьте себя

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

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

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