Horje

Ruby - Enumerators
Start
  Custom enumerators

Let's create an Enumerator (opens new window) for Fibonacci numbers (opens new window).

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 (opens new window) 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 (opens new window) should be returned.

This can be done using the enum_for (opens new window) method:

def each
  return enum_for :each unless block_given?

  yield :x
  yield :y
  yield :z
end

This enables the programmer to compose Enumerable (opens new window) operations:

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

  Rewinding

Use rewind (opens new window) 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

Parameter Details
yield Responds to yield, which is aliased as <<. Yielding to this object implements iteration.

Read Article
https://develop.horje.com/learn/1434/reference