Enumerable#index_by() が標準で欲しい
ActiveSupport で用意されている Enumerable#index_by() がRuby本体にとりこまれないかなー。
これ、ほんとよく使うわ。
module Enumerable def index_by() # 名前は to_hash のほうが好み hash = {} each do |item| key = yield(item) hash[key] = item end return hash end end ## example: キーが user id, 値が User オブジェクトであるような Hash を作る hash = User.find(:all).index_by {|user| user.id }
キーが重複している場合は、値をArrayにまとめてくれるのが必要。こっちはあんまり使ってない。
module Enumerable def group_by() hash = {} each do |item| key = yeild(item) (hash[key] ||= []) << item end return hash end end ## example: キーが group_id, 値が User オブジェクトであるような Hash を作る hash = User.find(:all).group_by {|user| user.group_id }
ActiveSupport の便利メソッドは微妙なのもあるけど、便利なやつは本当に便利なので、ぜひRuby本体にも欲しい。
・・・と思ったら、Enumerable#group_by は 1.8.7 から取り入れられていた。index_by は取り入れられないのかな?