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.

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