Ruby 2.0 で追加されたEnumerable::lazyをOKIソフトウェアさんのRuby 2.0 メモ: Lazy と LINQ とループ融合を参考に動かしてみました。
まずはrvmを最新にし、ruby 2.0をインストールします。
1 2 3 |
|
で、実験です。1から30までの整数で3が含まれるもの(3, 13, 23, 30)の最初の3つを求めるには
1 2 |
|
このコードでは、
map で各整数を文字列化
selectで文字列に3が出現するものを正規表現で選択する。=> [“3”, “13”, “23”, “30”]
takeで先頭の三つを取り出す。=> [“3”, “13”, “23”]
で、指定した範囲の最後まで読み込んでから次の処理を行う。
これに対し、lazyを用いたコードは以下。
1 2 |
|
先頭の3つを読み込んだところで終了しています。 これは、結果をArrayではなくEnumerable型として返すようにmapメソッドやselectメソッドを再定義し、実際に要素の値が必要になったとき、つまり、mapの処理はselectが呼ばれたときに開始、 selectの処理はtakeに呼ばれたときに開始…というように必要なときになったら呼び出すようになっています。