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"] # nilHash.new(default) muda isso. Cada chave ausente retorna o valor que você passou:
scores = Hash.new(0)
puts scores["Alice"] # 0Esta é 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.
Desafio
FácilLeia 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: 20Se 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"] # 0Isso 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
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