Enumeradores perezosos
Evaluación perezosa
Enumeradores perezosos es una lección gratuita de Ruby Academy en CoddyKit. Esta es la lección 3 de 4. Puedes leer la lección completa abajo gratuitamente — luego la practicas en el navegador con un editor de código integrado y un tutor de IA 24/7. Forma parte de la ruta de aprendizaje de Ruby Academy, y tu progreso se sincroniza en la web y la app de CoddyKit. El curso de Ruby Academy incluye 4 lecciones en total.
Evaluación diferida
Normalmente, los métodos de Enumerable procesan la colección completa de una vez. Un enumerador lazy procesa los elementos uno a uno, solo cuando es necesario. Esto permite trabajar con secuencias enormes o incluso infinitas.
result = (1..Float::INFINITY).lazy.map { |n| n * 2 }.first(5)
p resultEl problema de los métodos eager
Llamar a map sobre un rango infinito sin lazy no terminaría nunca, porque primero intenta crear un array de resultados completo.
# Eager version would hang. Lazy completes instantly:
first_three = (1..Float::INFINITY).lazy.select(&:even?).first(3)
p first_threeCrear un enumerador lazy
Llame a .lazy sobre cualquier enumerable para obtener una versión lazy. Los métodos encadenados también pasan a ser lazy.
lazy = (1..10).lazy
puts lazy.classNada se ejecuta hasta forzarlo
Las cadenas lazy crean una receta, pero no la ejecutan. Un método terminal como first, to_a o force activa el trabajo.
chain = (1..Float::INFINITY).lazy.map { |n| n * n }
puts "Nothing computed yet"
p chain.first(4)Forzar resultados
force (alias to_a) materializa una cadena lazy acotada en un array.
result = (1..20).lazy.select(&:odd?).first(5)
p result
all = (1..6).lazy.map { |n| n * 10 }.force
p allEncadenar de forma lazy
Varias operaciones lazy se intercalan por elemento en lugar de ejecutarse como pasadas completas independientes. Cada valor recorre toda la cadena antes de que comience el siguiente.
result = (1..Float::INFINITY)
.lazy
.map { |n| n * n }
.select { |n| n.even? }
.first(4)
p resulttake y take_while
take y take_while en modo lazy dejan de extraer valores cuando se cumple su condición.
result = (1..Float::INFINITY).lazy.take_while { |n| n < 6 }.to_a
p resultSecuencias infinitas
Los enumeradores lazy destacan al trabajar con generadores. Combínelos con Enumerator para modelar flujos interminables.
naturals = Enumerator.new do |y|
n = 1
loop { y << n; n += 1 }
end
p naturals.lazy.map { |x| x * 3 }.first(5)Eficiencia de memoria
Como las cadenas lazy nunca materializan toda la colección intermedia, ahorran memoria al filtrar grandes volúmenes de datos hasta obtener unos pocos resultados.
big = (1..1_000_000).lazy
first_match = big.select { |n| n % 7 == 0 && n % 11 == 0 }.first
puts first_matchCuándo usar lazy
Use lazy cuando:
- La fuente sea infinita o muy grande.
- Solo necesite unos pocos resultados.
- Quiera evitar arrays intermedios grandes.
Para colecciones pequeñas, los métodos eager son más sencillos y suficientemente rápidos.
fizz = (1..Float::INFINITY).lazy.select { |n| n % 3 == 0 }.first(5)
p fizzCómo encaja todo
Los enumeradores lazy posponen el trabajo:
.lazyhace que una cadena sea lazy.- El trabajo se ejecuta solo cuando un método terminal extrae valores.
- Son perfectos para secuencias infinitas o enormes.
squares = (1..Float::INFINITY).lazy.map { |n| n * n }
p squares.select(&:odd?).first(4)Comprobación rápida
Compruebe cuánto entiende de los enumeradores lazy.
Resumen
Ha aprendido sobre los enumeradores lazy:
.lazypospone el cálculo.- Los métodos terminales (
first,to_a,force) activan el trabajo. - Cada valor recorre toda la cadena según sea necesario.
- Son ideales para secuencias infinitas o grandes.
p (1..Float::INFINITY).lazy.select(&:even?).map { |n| n + 1 }.first(3)Preguntas frecuentes
¿La lección «Enumeradores perezosos» es gratis?
Sí — el texto completo de «Enumeradores perezosos» es gratis para leer aquí en la web. Para practicarla de forma interactiva (editor de código integrado y tutor de IA 24/7) y desbloquear el resto del curso de Ruby Academy, actualiza a CoddyKit PRO. El curso de Ruby Academy incluye 4 lecciones en total.
¿Qué aprenderé en «Enumeradores perezosos»?
Evaluación perezosa Practicas Ruby Academy con código real que ejecutas directamente en el navegador, y un tutor de IA 24/7 responde tus preguntas mientras trabajas en la lección.
¿Necesito experiencia previa para empezar Ruby Academy?
No se requiere experiencia previa. Ruby Academy en CoddyKit está estructurado para principiantes hasta estudiantes avanzados, así que puedes empezar aquí o desde el inicio y avanzar a tu ritmo. Esta es la lección 3 de 4.
¿Cuánto tiempo toma la lección «Enumeradores perezosos»?
La mayoría de las lecciones de CoddyKit toman alrededor de 5–10 minutos. Cada una es compacta e interactiva, así que avanzas constantemente y retomas exactamente por donde dejaste en la web y la app.
¿Puedo escribir y ejecutar código en esta lección de Ruby Academy?
Sí. Cada lección de Ruby Academy incluye un editor de código integrado, así que escribes y ejecutas código real directamente en tu navegador y obtienes retroalimentación instantánea de IA — sin configuración local necesaria.
Todas las lecciones de este curso
- Escritura de un each personalizado
- Inclusión de Enumerable
- Enumeradores perezosos
- Objetos Enumerator