Ruby viene equipado con la clase Enumerator, que inclue Enumerable. Esta clase es muy útil para un par de cosas, pero es realmente buena para generar secuencias (posiblemente infinitas).

Vamos con un clásica: la secuancia Fibbonacci puede ser implementada de esta manera:

fib = Enumerator.new do |yielder|
  a, b = 1, 0
  loop do
    yielder.yield b
    a, b = b, a + b
  end
end

fib.next #=> 1
fib.next #=> 1
fib.next #=> 2
fib.next #=> 3
fib.next #=> 5

fib.rewind # utilizar retroceso para restablecer el secuenciador
fib.next #=> 1
# y un montón de métodos de forma gratuita!

fib.take_while { |i| i <= 100 }
=> [0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89]

fib.first(10)
=> [0, 1, 1, 2, 3, 5, 8, 13, 21, 34]

fib.select(&:prime?) # No deje que ruby asuma que su enumerador es finito (si no lo es)
=> '*colapso universal*' 

¿Qué pasa con las funciones matemáticas?

class Quadratic < Enumerator
  # argumentos de palabra clave, nuevos en Ruby 2.0
  # comprobar los enlaces para más información
  def initialize(a=0,b=0,c=0, floor: 0, ceiling: Float::INFINITY)
    super() do |yielder|
      x = floor
      while x <= ceiling do
        yielder << a*x**2 + b*x + c
        x += 1
      end
    end
  end
end

q = Quadratic.new 1, 0, 0, floor: -10, ceiling: 10

q.next
=> 100
q.next
=> 81
q.each.with_index { |n, i| puts "f(#{i-10})= #{n}" }
=> [10000,
 6561,
 4096,
 2401,
 1296,
 625,
 256,
 81,
 16,
 1,
 0,
 1,
 16,
 81,
 256,
 625,
 1296,
 2401,
 4096,
 6561,
 10000]

Ver más:

http://ruby-doc.org/core-2.0/Enumerator.html
http://blog.rubyhead.com/2013/02/26/ruby-2-0-getting-started-named-parameters/

Ruby on Rails developer at Altoros Argentina