Menu
Coddy logo textTech

Hash.new con valores predeterminados

Parte de la sección Lógica y flujo del Journey de Ruby de Coddy. Lección 33 de 56.

De forma predeterminada, buscar una clave que falta en un hash devuelve nil:

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

Hash.new(default) cambia eso. Cada clave faltante devuelve el valor que proporcionaste:

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

Esta es la forma más limpia de escribir un contador. No necesitas comprobar 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) establece el valor predeterminado en 0, pero no almacena la clave cuando la lees. El hash permanece vacío hasta que asignas un valor. Así que, una vez que escribes counts[letter] += 1, la clave se añade con el nuevo valor.

challenge icon

Desafío

Fácil

Lee una lista separada por comas de entradas category:amount (por ejemplo, food:12,gas:30,food:8,books:25,gas:15). Construye un hash de totales por categoría usando Hash.new(0) y, después, imprime solo las categorías cuyo total sea como mínimo 20, una por línea, ordenadas por total de forma descendente:

<category>: <total>

Para la entrada de ejemplo anterior, la salida es:

gas: 45
books: 25
food: 20

Si ninguna categoría alcanza 20, no imprimas nada.

Pruébalo tú mismo

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

# TODO: totals = Hash.new(0); acumular cantidad por categoría;
#       luego imprimir categorías con total >= 20, ordenadas por total desc
quiz iconPonte a prueba

Esta lección incluye un breve cuestionario. Empieza la lección para responderlo y registrar tu progreso.

Todas las lecciones de Lógica y flujo

Practica por tu cuenta: Compilador de Ruby online