Enumerable Patterns
Lazy Enumerator
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
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(",")}"
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
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
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