Ruby 2.0.0リリース! – Enumerable#lazyを使ってみよう

Ruby 2.0の最も特徴的な新機能の1つ、lazyを使ってみましょう。

いかにもわざとらしい例ですが、まずはフィボナッチ数列を10個表示してみます。

fib = Enumerator.new do |y| 
  i1 = 0 
  i2 = 1 
  y << 1
  loop do
    i3 = i1 + i2
    i1 = i2
    i2 = i3
    y << i3
  end 
end

> p fib.each.take(10).to_a
[1, 1, 2, 3, 5, 8, 13, 21, 34, 55]

これは簡単ですね。

次に、フィボナッチ数列から偶数のみ10個取り出してみます。
奇数→奇数→偶数の順で現れるのは明白ですが、ここではその規則を知らないつもりで。素数とかにすれば良いんですがコードが多くなるので・・

> p fib.each.select{|i| i.even?}.take(10).to_a
無限ループ!

無限ループになってしまいました。
selectは事前に値がそろってないと使えませんね。

lazyを使って書き直してみます。

> p fib.each.lazy.select{|i| i.even?}.take(10).to_a
[2, 8, 34, 144, 610, 2584, 10946, 46368, 196418, 832040]

簡単に計算できました。便利ですね。

実際に、DBからLIMIT付で値を取得する際に、DB側のSELECTだけでは絞り込みができない場合などにも使えそうです。
1件ごと取得になるので重いですが、データ件数がたとえば1000万件なら、全件取得してから絞り込むよりも現実的に使える可能性があります。

Ruby on RailsによるWEBシステム開発、Android/iPhoneアプリ開発、電子書籍配信のことならお任せください この記事を書いた人と働こう! Ruby on Rails の開発なら実績豊富なBPS

この記事の著者

baba

ゆとりプログラマー。 高校時代から趣味でプログラミングを初め、そのままコードを書き続けて現在に至る。慶應義塾大学環境情報学部(SFC)卒業。BPS設立初期に在学中から参加している最古参メンバーの一人。得意分野はWeb全般、Ruby on Rails、Androidアプリケーションなど。最近はBlinkと格闘中。軽度の資格マニアで、情報処理技術者試験(高度10区分)などを保有。

babaの書いた記事

週刊Railsウォッチ

インフラ

Rubyスタイルガイドを読む

BigBinary記事より

ActiveSupport探訪シリーズ