A lazy enumerator delays work until values are requested.

lazy enumerator Lazy chains are useful when only a small number of results are needed.

Lazy Enumerator

limit
lazy_enumerator.rb
Replay: real traced execution (multi-file project)
limit = 3

values = (1..20).lazy
  .map do |number|
    number * 2
  end
  .select do |number|
    number % 3 != 0
  end
  .take(limit)
  .to_a

puts "limit=#{limit}"
puts "values=#{values.join(",")}"
limit = 2

values = (1..20).lazy
  .map do |number|
    number * 2
  end
  .select do |number|
    number % 3 != 0
  end
  .take(limit)
  .to_a

puts "limit=#{limit}"
puts "values=#{values.join(",")}"
limit = 5

values = (1..20).lazy
  .map do |number|
    number * 2
  end
  .select do |number|
    number % 3 != 0
  end
  .take(limit)
  .to_a

puts "limit=#{limit}"
puts "values=#{values.join(",")}"
  1. limit ← 3, values ← [2, 4, 8]

    1limit→ 3 = 3  #@limit=2, 523values→ [2, 4, 8] = (1..20).lazy4  .map do |number|5    number * 26  end7  .select do |number|8    number % 3 != 09  end10  .take(limit3)11  .to_a1213puts "limit=#{limit3}"14puts "values=#{values.join(",")2,4,8}"
    outputlimit=3
    values=2,4,8
  1. limit ← 2, values ← [2, 4]

    1limit→ 2 = 223values→ [2, 4] = (1..20).lazy4  .map do |number|5    number * 26  end7  .select do |number|8    number % 3 != 09  end10  .take(limit2)11  .to_a1213puts "limit=#{limit2}"14puts "values=#{values.join(",")2,4}"
    outputlimit=2
    values=2,4
  1. limit ← 5, values ← [2, 4, 8, 10, 14]

    1limit→ 5 = 523values→ [2, 4, 8, 10, 14] = (1..20).lazy4  .map do |number|5    number * 26  end7  .select do |number|8    number % 3 != 09  end10  .take(limit5)11  .to_a1213puts "limit=#{limit5}"14puts "values=#{values.join(",")2,4,8,10,14}"
    outputlimit=5
    values=2,4,8,10,14