Menu
Coddy logo textTech

Hashes Aninhados

Parte da seção Lógica e Fluxo do Journey de Ruby da Coddy. Lição 35 de 56.

Um valor de hash pode ser, ele próprio, um hash. Essa estrutura aninhada é como o código Ruby normalmente representa registros estruturados: um único hash indexado por id (ou nome), em que cada valor contém seus próprios campos:

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

Para acessar um valor aninhado, encadeie as consultas:

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

Adicionar um novo campo a um dos hashes internos funciona da mesma forma:

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

Para ler com segurança a partir de um hash aninhado que pode não ter uma chave em qualquer nível, dig percorre a cadeia e retorna nil se algo estiver faltando no caminho:

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

Desafio

Médio

Um hash aninhado inventory é fornecido: cada chave de nível superior é um departamento, cada chave interna é um item, e cada valor interno é a quantidade em estoque (um número inteiro).

Leia uma linha de entrada: uma lista separada por vírgulas de caminhos de consulta department/item.

Para cada caminho, na ordem, use dig para resolvê-lo. Imprima uma destas opções:

  • <department>/<item>: <qty> quando o caminho existir
  • <department>/<item>: missing quando dig retornar nil

Depois de imprimir todas as linhas, imprima também uma linha de resumo:

Total inventory: <sum>

O total é a soma de every quantidade em todos os departamentos do hash original. Use iteração aninhada (cada departamento, depois cada item).

Para a entrada fruits/apples,meat/beef,fruits/dragonfruit,dairy/milk, a saída é:

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

Experimente você mesmo

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

# TODO: para cada lookup, dig e imprima qty ou 'missing'.
#       Then print 'Total inventory: <sum>' across all items.
quiz iconTeste seus conhecimentos

Esta lição inclui um quiz rápido. Comece a lição para respondê-lo e acompanhar seu progresso.

Todas as lições de Lógica e Fluxo

Pratique por conta própria: Compilador de Ruby online