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.
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