Menu
Coddy logo textTech

Hash.new con valores por defecto

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

Por defecto, buscar una clave inexistente en un hash devuelve nil:

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

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

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 realizas una asignación. 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 de entradas category:amount separadas por comas (p. ej. food:12,gas:30,food:8,books:25,gas:15). Construye un hash de totales por categoría usando Hash.new(0), luego imprime solo las categorías cuyo total sea al menos 20, una por línea, ordenadas por total 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.

Hoja de referencia

Por defecto, las claves de hash que faltan devuelven nil. Usa Hash.new(default) para devolver un valor por defecto diferente en su lugar:

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

Esto hace que los contadores sean limpios — no hay necesidad de comprobar nil antes de incrementar:

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

Nota: leer una clave que falta no la almacena. La clave solo se añade una vez que asignas un valor (por ejemplo, +=).

Pruébalo tú mismo

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

# TODO: totals = Hash.new(0); acumular el monto por categoría;
#       luego imprimir las categorías con un 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