Buscar..


Introducción

Un Enumerator es un objeto que implementa la iteración de una manera controlada.

En lugar de realizar un bucle hasta que se cumpla alguna condición, el objeto enumera los valores según sea necesario. La ejecución del bucle se detiene hasta que el propietario del objeto solicita el siguiente valor.

Los enumeradores hacen posible la transmisión infinita de valores.

Parámetros

Parámetro Detalles
yield Responde al yield , que se presenta como << . El ceder a este objeto implementa la iteración.

Enumeradores personalizados

Vamos a crear un Enumerator para los números de Fibonacci .

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

Ahora podemos usar cualquier método Enumerable con fibonacci :

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

Metodos existentes

Si se llama a un método de iteración como each sin un bloque, se debe devolver un Enumerator .

Esto se puede hacer usando el método enum_for :

def each
  return enum_for :each unless block_given?

  yield :x
  yield :y
  yield :z
end

Esto le permite al programador componer operaciones Enumerable :

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

Rebobinado

Utilice rewind para reiniciar el enumerador.

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

ℕ.next
# => 0

ℕ.next
# => 1

ℕ.next
# => 2

ℕ.rewind

ℕ.next
# => 0


Modified text is an extract of the original Stack Overflow Documentation
Licenciado bajo CC BY-SA 3.0
No afiliado a Stack Overflow