Enumerable モジュールを使って Fibonacci number を実装する例です。
# fibonacci.rb class Fibonacci include Enumerable def each if block_given? n1, n2 = 1, 1 loop do yield n1 n1, n2 = n2, n1 + n2 end else to_enum end end end
先頭から 10 個の数を取得する。
$ ruby -r./fibonacci -e 'puts Fibonacci.new.take(10)' 1 1 2 3 5 8 13 21 34 55
先頭から 200 未満の数を取得する。
$ ruby -r./fibonacci -e 'puts Fibonacci.new.take_while {|f| f < 200 }' 1 1 2 3 5 8 13 21 34 55 89 144
各数の平方を先頭から 10 個取得する(だめな例)。
$ ruby -r './fibonacci' -e 'puts Fibonacci.new.map {|f| f * f }.take(10)'
#take
が評価されるのは #map
が すべての数 を処理してからなので、永遠にそのときはやってきません。
こんなときのための遅延評価です。
各数の平方を先頭から 10 個取得する。
$ ruby -r./fibonacci -e 'puts Fibonacci.new.lazy.map {|f| f * f }.take(10).to_a' 1 1 4 9 25 64 169 441 1156 3025
だいたいこんな感じ。