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] # BAdicionar 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) # nilDesafio
MédioUm 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>: missingquando odigretornarnil
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: 39Folha 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] # 20Atribua 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) # nilExperimente 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.
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
1Strings a Fundo
Visão Geral de Métodos de StringInterpolação de StringsIterando sobre StringsSplit e JoinRecapitulação - String Weaver4Blocos, Procs e Lambdas
O que é um Bloco?do..end vs ChavesA palavra-chave yieldParâmetros de BlocoProcs e LambdasRecapitulação - Iterador Customizado7Hashes Parte 2
Hash.new com Valores PadrãoIterando em HashesHashes AninhadosMesclando e TransformandoRecapitulação - Contador de Frequência10Projeto - Registros de Alunos
Visão Geral do ProjetoAdicionar Aluno2Intervalos
O que é um Intervalo?Métodos de IntervaloIntervalos em Case / WhenRecapitulação - Prática com Intervalos5O Poder do Enumerable
Select e RejectEncadeando o MapReduce / Injectcount, all?, any?, none?group_by e partitionsort_by, min_by, max_byRecapitulação - Data Pipeline