例えば、フィボナッチ数列(0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, 610, 987, 1597, 2584, 4181, 6765, 10946 ..)を作るようなクラスを作りたいとして、下のようなコードを書いたとします。

 class Fibonacci
   def initialize(n)
     @n = n
     @f1 = 1
     @f0 = 0
   end

   def to_a
     (0..(@n-1)).map {|t| fib t }
   end

   def fib t
     case t
     when 0..1
       t
     else
       now = @f1 + @f0
       @f0 = @f1
       @f1 = now
     end
   end
   private :fib
 end

このとき、このコードは下のように実行することができるかと思われます。

 Fibonacci.new(10).to_a.each_with_index do |result, index|
   puts "#{index + 1}番目: #{result}"
 end

とはいえ、わざわざto_aを呼び出して、一度Arrayにしてから、each_with_indexを呼び出すのは非常に冗長のように感じます。むしろこのオブジェクトに対して、直接each_with_index(あるいはeach)を呼び出せたほうが簡潔になるように感じます。例えば下のようにです。

 Fibonacci.new(10).each_with_index do |result, index|
   puts "#{index + 1}番目: #{result}"
 end

このようにするためには、このクラスにはどのようなコードを追加してあげればいいのでしょうか。同様に、mapなども共通で実装できれば、よりベターです。