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 mesmo, um hash. Este formato aninhado é como o código Ruby normalmente representa registros estruturados, um único hash indexado por id (ou nome), onde cada valor carrega seus próprios campos:

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

Para acessar um valor aninhado, encadeie as buscas:

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

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

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

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

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

Desafio

Médio

Um hash inventory aninhado é 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 busca department/item.

Para cada caminho, em ordem, use dig para resolvê-lo. Imprima:

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

Após imprimir cada linha, imprima também uma linha de resumo:

Total inventory: <sum>

O total é a soma de cada quantidade em todos os departamentos no 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

Folha de consulta

Hashes aninhados armazenam hashes como valores dentro de outro hash:

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

Encadeie buscas para acessar valores aninhados:

students["Alice"][:age]    # 20

Atribua para adicionar ou atualizar um campo aninhado:

students["Alice"][:major] = "Math"

Use dig para percorrer chaves aninhadas com segurança — retorna nil se qualquer chave estiver faltando:

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

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 busca, use dig e imprima a quantidade ou 'missing'.
#       Depois imprima 'Total inventory: <soma>' de todos os itens.
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