Ruby
Tips
Lazy Enumerators
Let’s say we want to find numbers that are divisible by 19
and 23
.
infinite_range = (1..Float::INFINITY)
Calling select
on infinite range will hang forever because select
is eager:
e = infinite_range.select {|n| n % 19 == 0 && n % 23 == 0 }
Adding lazy
will return an Enumerator::Lazy
instance:
e = infinite_range.lazy.select {|n| n % 19 == 0 && n % 23 == 0 }
Now we can call next
on the enumerator and select
will be evaluated lazily:
e.class #=> Enumerator::Lazy
e.next #=> 437
e.next #=> 874