Rubyで簡潔にeachなどの機能を持つクラスを実装する方法
例えば、フィボナッチ数列(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
なども共通で実装できれば、よりベターです。