Iterando em Hashes
Parte da seção Lógica e Fluxo do Journey de Ruby da Coddy — lição 34 de 56.
Hashes são enumeráveis, então você pode iterá-los assim como arrays. Existem três padrões comuns, dependendo do que você deseja.
each entrega para você tanto a chave quanto o valor:
prices = { apple: 1, bread: 3, milk: 4 }
prices.each do |item, price|
puts "#{item}: $#{price}"
endeach_key percorre apenas as chaves:
prices.each_key { |k| puts k } # maçã, pão, leiteeach_value percorre apenas os valores:
prices.each_value { |v| puts v } # 1, 3, 4E todos os métodos Enumerable que você viu no capítulo anterior, map, select, reduce: funcionam em hashes também. Você apenas recebe um par chave/valor (ou um array de 2 elementos) por iteração:
prices.select { |item, price| price > 2 }
# {bread: 3, milk: 4}Desafio
MédioVocê está aplicando uma promoção a uma lista de preços. O hash prices é fornecido (símbolo do item => preço inteiro).
Leia uma linha de entrada: uma lista separada por vírgulas de itens para descontar em 50% (correspondendo aos símbolos no hash, pelo nome).
Imprima, nesta ordem:
- Uma linha por item no formato
<item>: <item>: $<final_price>lt;final_price>, onde o preço final é o valor com desconto quando o item está na lista de descontos, ou o valor original caso contrário. Itere comeach. Os itens mantêm sua ordem original. Use divisão inteira para o desconto (price / 2). Was: Was: $<n>lt;n>: o total original (usevalues.sum)Now: Now: $<n>lt;n>: o total pós-desconto- Os nomes dos itens cujo preço final ainda é superior a
2, unidos com,(useselect+keysno novo hash)
Para a entrada bread,milk com o hash padrão, a saída é:
apple: $1
bread: $1
milk: $2
cheese: $6
Was: $14
Now: $10
cheeseFolha de consulta
Iterando sobre hashes com each, each_key, each_value:
prices = { apple: 1, bread: 3, milk: 4 }
prices.each { |item, price| puts "#{item}: $#{price}" }
prices.each_key { |k| puts k }
prices.each_value { |v| puts v }Métodos Enumerable como map, select e reduce também funcionam em hashes, recebendo um par chave/valor por iteração:
prices.select { |item, price| price > 2 }
# { bread: 3, milk: 4 }Métodos de hash úteis: .values.sum para somar todos os valores, .keys para obter um array de chaves.
Experimente você mesmo
prices = { apple: 1, bread: 3, milk: 4, cheese: 6 }
discount = gets.chomp.split(",").map(&:to_sym)
# TODO: construir o hash de preço final via each; imprimir linhas, totais, itens caros
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