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] # BAdicionar 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) # nilDesafio
MédioUm 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>: missingquandodigretornarnil
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: 39Experimente 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.
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 em Profundidade
Visão Geral dos Métodos de StringInterpolação de StringsPercorrendo StringsDividir e UnirRecapitulação - String Weaver4Blocos, Procs e Lambdas
O que é um Bloco?do..end vs ChavesA Palavra-chave yieldParâmetros de BlocoProcs e LambdasRevisão - Iterador Personalizado7Hashes - Parte 2
Hash.new com Valores PadrãoIterando sobre 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 / WhenRevisão - Prática com intervalos5Potência do Enumerable
Select e RejectEncadeando MapReduce / Injectcount, all?, any?, none?group_by e partitionsort_by, min_by, max_byRecapitulação - Pipeline de DadosPratique por conta própria: Compilador de Ruby online