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"] # nilHash.new(default) cambia eso. Cada clave faltante devuelve el valor que pasaste:
scores = Hash.new(0)
puts scores["Alice"] # 0Esta 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.
Desafío
FácilLee 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: 20Si 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"] # 0Esto 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
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
1Strings en profundidad
Visión general de los métodos de StringInterpolación de StringsIterar sobre StringsSplit y JoinRepaso - String Weaver4Bloques, Procs y Lambdas
¿Qué es un bloque?do..end vs llavesLa palabra clave yieldParámetros de bloqueProcs y LambdasResumen - Iterador personalizado7Hashes Parte 2
Hash.new con valores por defectoIteración de HashesHashes anidadosFusión y transformaciónResumen - Contador de frecuencia10Proyecto - Registros de Estudiantes
Descripción general del proyectoAgregar estudiante5Potencia de Enumerable
Select y RejectEncadenando MapReduce / Injectcount, all?, any?, none?group_by y partitionsort_by, min_by, max_byResumen - Data Pipeline