Ruby1.8.7の新機能@いくつか実装してみた

今まで,Scheme

(take (circular-list 1 2 3) 10)

とか書いてたことが,Ruby

[1,2,3].cycle.take(10)

と書けるようになった.これは嬉しい.
Object#tapも早速乱用.

module Enumerable
  def group_by
    Hash.new {[]}.tap {|ht|
      each {|i|
        ht[yield(i)] <<= i
      }
    }
  end
end

今までEnumerable#takeが欲しいなぁと思ったことはあまりないけど,EnumerableやEnumeratorが強力になったお陰で,これからのRubyでは需要が高まりそうだ.
Schemeで当たり前のようにtakeとか書いてたことが,Rubyでもきっとやりやすくなるんだろうなぁ.
あとListとcar,cdrがあればいいのに(笑).


(追記)
Enumerableだからeach使わなきゃ…と思ってたら,group_byをinject使って一行で実装してるのを見つけてしまった.そうだよね.別に直接each使わなくてもいいんだ.