エンジニアのソフトウェア的愛情

または私は如何にして心配するのを止めてプログラムを・愛する・ようになったか

Ruby の Enumerable モジュールの使い方の覚書

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

だいたいこんな感じ。