Вложенные хэши
Часть раздела Логика и управление потоком путешествия по 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Задание
СреднеДан вложенный хеш 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.
В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.
Все уроки раздела Логика и управление потоком
1Строки: подробный разбор
Обзор методов строкИнтерполяция строкПеребор строкРазделение и объединениеПовторение — String Weaver4Блоки, Proc и Lambda
Что такое блок?do..end и фигурные скобкиКлючевое слово yieldПараметры блокаProc и LambdaПовторение — пользовательский итератор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Повторение — конвейер данных3Двумерные массивы
Основы двумерных массивовДоступ к элементам двумерного массиваПеребор двумерных массивовРаспространённые шаблоны для двумерных массивовПовторение — операции с матрицами6Проект — Менеджер библиотеки
Обзор проектаДобавление книгиПотренируйтесь самостоятельно: Онлайн-компилятор Ruby