Menu
Coddy logo textTech

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 da mesma forma que os arrays. Existem três padrões comuns, dependendo do que você precisa.

each passa para você tanto a chave quanto o valor:

prices = { apple: 1, bread: 3, milk: 4 }
prices.each do |item, price|
  puts "#{item}: $#{price}"
end

each_key percorre apenas as chaves:

prices.each_key { |k| puts k }   # apple, bread, milk

each_value percorre apenas os valores:

prices.each_value { |v| puts v }   # 1, 3, 4

E 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}
challenge icon

Desafio

Médio

Você está aplicando uma promoção a uma lista de preços. A hash prices é fornecida (símbolo do item => inteiro do preço).

Leia uma linha de entrada: uma lista separada por vírgulas de itens para aplicar desconto de 50% (correspondendo aos símbolos na hash, por nome).

Imprima, nesta ordem:

  1. Uma linha por item no formato <item>: $<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 com each. Os itens mantêm sua ordem original. Use divisão inteira para o desconto (price / 2).
  2. Was: $<n>: o total original (use values.sum)
  3. Now: $<n>: o total após o desconto
  4. Os nomes dos itens cujo preço final ainda é maior que 2, unidos com , (use select + keys na nova hash)

Para a entrada bread,milk com a hash padrão, a saída é:

apple: $1
bread: $1
milk: $2
cheese: $6
Was: $14
Now: $10
cheese

Experimente você mesmo

prices = { apple: 1, bread: 3, milk: 4, cheese: 6 }
discount = gets.chomp.split(",").map(&:to_sym)

# TODO: construa o hash de preço-final via each; imprima linhas, totais, itens caros
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