Вложенные хеши
Часть раздела Логика и управление потоком путешествия по Ruby на Coddy — урок 35 из 56.
Значение хеша само может быть хешем. Такая вложенная структура — это то, как код на Ruby обычно представляет структурированные записи: единый хеш, где ключом является id (или имя), а каждое значение содержит свои собственные поля:
students = {
"Alice" => { age: 20, grade: "A" },
"Bob" => { age: 22, grade: "B" }
}Чтобы получить доступ к вложенному значению, используйте цепочку обращений:
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Задание
СреднеДан вложенный хеш inventory: каждый ключ верхнего уровня — это отдел (department), каждый внутренний ключ — товар (item), а каждое внутреннее значение — количество на складе (целое число).
Прочитайте одну строку ввода: список путей поиска department/item, разделенных запятыми.
Для каждого пути по порядку используйте dig, чтобы разрешить его. Выведите либо:
<department>/<item>: <qty>, если путь существует<department>/<item>: missing, еслиdigвозвращаетnil
После вывода каждой строки также выведите одну итоговую строку:
Total inventory: <sum>Итог — это сумма каждого количества во всех отделах исходного хеша. Используйте вложенную итерацию (каждый отдел, затем каждый товар).
Для ввода fruits/apples,meat/beef,fruits/dragonfruit,dairy/milk вывод будет следующим:
fruits/apples: 12
meat/beef: 7
fruits/dragonfruit: missing
dairy/milk: 9
Total inventory: 39Шпаргалка
Вложенные хеши хранят хеши в качестве значений внутри другого хеша:
students = {
"Alice" => { age: 20, grade: "A" },
"Bob" => { age: 22, grade: "B" }
}Используйте цепочку обращений для доступа к вложенным значениям:
students["Alice"][:age] # 20Используйте присваивание, чтобы добавить или обновить вложенное поле:
students["Alice"][:major] = "Math"Используйте dig для безопасного обхода вложенных ключей — возвращает nil, если какой-либо ключ отсутствует:
students.dig("Alice", :grade) # "A"
students.dig("Cara", :grade) # nilПопробуйте сами
inventory = {
fruits: { apples: 12, bananas: 4 },
meat: { beef: 7, chicken: 5 },
dairy: { milk: 9, cheese: 2 }
}
lookups = gets.chomp.split(",")
# TODO: для каждого поиска извлеките и выведите количество или 'missing'.
# Затем выведите 'Total inventory: <sum>' по всем позициям.
В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.
Все уроки раздела Логика и управление потоком
1Строки в деталях
Обзор методов строкИнтерполяция строкИтерация по строкамSplit и JoinИтоги — String Weaver4Блоки, Proc и лямбды
Что такое блок?do..end против фигурных скобокКлючевое слово yieldПараметры блокаProc и лямбдыИтоги: пользовательский итератор7Хеши. Часть 2
Hash.new со значениями по умолчаниюИтерация по хешамВложенные хешиСлияние и преобразованиеИтоги — счетчик частоты10Проект — Учёт студентов
Обзор проектаДобавить студента2Диапазоны
Что такое диапазон?Методы диапазоновДиапазоны в Case / WhenПовторение — практика по диапазонам5Мощь Enumerable
Select и RejectЦепочки MapReduce / Injectcount, all?, any?, none?group_by и partitionsort_by, min_by, max_byИтоги — Data Pipeline8Продвинутые условные конструкции
Case с классами и RegexМножественные значения в whenТернарный операторОднострочные if / unlessПовторение: Классификатор оценок