Menu
Coddy logo textTech

Hash.new com Valores Padrão

Parte da seção Lógica e Fluxo do Journey de Ruby da Coddy — lição 33 de 56.

Por padrão, procurar uma chave ausente em um hash retorna nil:

scores = {}
puts scores["Alice"]   # nil

Hash.new(default) muda isso. Cada chave ausente retorna o valor que você passou:

scores = Hash.new(0)
puts scores["Alice"]   # 0

Esta é a maneira mais limpa de escrever um contador. Você não precisa verificar if scores[name].nil? antes de incrementar:

counts = Hash.new(0)
["a", "b", "a", "c", "a"].each do |letter|
  counts[letter] += 1
end
puts counts.inspect   # {"a"=>3, "b"=>1, "c"=>1}

Importante: Hash.new(0) define o padrão como 0, mas não armazena a chave quando você a lê. O hash permanece vazio até que você faça uma atribuição. Assim, uma vez que você escreve counts[letter] += 1, a chave é adicionada com o novo valor.

challenge icon

Desafio

Fácil

Leia uma lista separada por vírgulas de entradas category:amount (ex: food:12,gas:30,food:8,books:25,gas:15). Construa um hash de totais por categoria usando Hash.new(0), então imprima apenas as categorias cujo total seja pelo menos 20, uma por linha, ordenadas pelo total decrescente:

<category>: <total>

Para a entrada de exemplo acima, a saída é:

gas: 45
books: 25
food: 20

Se nenhuma categoria atingir 20, não imprima nada.

Folha de consulta

Por padrão, chaves de hash ausentes retornam nil. Use Hash.new(default) para retornar um valor padrão diferente em vez disso:

scores = Hash.new(0)
puts scores["Alice"]   # 0

Isso torna os contadores limpos — sem necessidade de verificar por nil antes de incrementar:

counts = Hash.new(0)
["a", "b", "a"].each do |letter|
  counts[letter] += 1
end
# {"a"=>2, "b"=>1}

Nota: ler uma chave ausente não a armazena. A chave só é adicionada quando você atribui um valor (ex: +=).

Experimente você mesmo

entries = gets.chomp.split(",")

# TODO: totals = Hash.new(0); acumular o valor por categoria;
#       então imprimir categorias com total >= 20, ordenadas por total desc
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