Enumerators

Other topics

Custom enumerators

Let's create an Enumerator for Fibonacci numbers.

fibonacci = Enumerator.new do |yielder|
  a = b = 1
  loop do
    yielder << a
    a, b = b, a + b
  end
end

We can now use any Enumerable method with fibonacci:

fibonacci.take 10
# => [1, 1, 2, 3, 5, 8, 13, 21, 34, 55]

Existing methods

If an iteration method such as each is called without a block, an Enumerator should be returned.

This can be done using the enum_for method:

def each
  return enum_for :each unless block_given?

  yield :x
  yield :y
  yield :z
end

This enables the programmer to compose Enumerable operations:

each.drop(2).map(&:upcase).first
# => :Z

Rewinding

Use rewind to restart the enumerator.

ℕ = Enumerator.new do |yielder|
  x = 0
  loop do
    yielder << x
    x += 1
  end
end

ℕ.next
# => 0

ℕ.next
# => 1

ℕ.next
# => 2

ℕ.rewind

ℕ.next
# => 0

Parameters:

ParameterDetails
yieldResponds to yield, which is aliased as <<. Yielding to this object implements iteration.

Contributors

Topic Id: 4985

Example Ids: 17583,17584,17585

This site is not affiliated with any of the contributors.