« Ruby on Railsのログファイルに色をつけない方法 | メイン | RailsのAPIドキュメントいろいろ »

ActiveSupportのEnumerable#group_by

ActiveSupportのEnumerable#group_byについて。

Railsレシピブックの330ページでは、

引数に渡したブロックの戻り値をキー、その戻り値の値となる要素の配列を値とする新たなハッシュを返します。

331ページのコードでは、group_byがHashを返しています。

comments_by_date = UserComment.find(:all).group_by(&:created_at)
#=> { #<Date: 2008/05/03 =>
       [#<UserComment created_at=#<Date: 2008/05/03, text="...">,

Ruby 1.8.6とRuby on Rails2.1.0で実際に試してみたところ、group_byは次のような値を返しました。

#=> [[#<Date: 2008/05/03>, [#<UserComment ...>, #<UserComment ...>]],
     [#<Date: 2008/05/04>, [#<UserComment ...>, #<UserComment ...>]]]

Hashが返ってくるはずなのに、Arrayが返ってきています。

実は、一見するとArrayのように見えますが、ActiveSupport::OrderedHashクラスのインスタンスです。 ActiveSupport::OrderedHashはArrayクラスのサブクラスで、[]メソッドを再定義しています。
そのため、Hashと同じように[]で要素にアクセスすることができます。
ActiveSupport::OrderedHashはArrayなのですが、あたかもHashのように扱うことができるのです。

トラックバック

このエントリーのトラックバックURL:
http://www.gesource.jp/mt/mt-tb.cgi/770

コメント (1)

榊祐介:

見た目Arrayで操作はhashなので一見すると混乱しますよね。
黒魔術!黒魔術!

コメントを投稿

(いままで、ここでコメントしたことがないときは、コメントを表示する前にこのブログのオーナーの承認が必要になることがあります。承認されるまではコメントは表示されません。そのときはしばらく待ってください。)

About

2008年07月11日 08:20に投稿されたエントリーのページです。

ひとつ前の投稿は「Ruby on Railsのログファイルに色をつけない方法」です。

次の投稿は「RailsのAPIドキュメントいろいろ」です。

他にも多くのエントリーがあります。メインページアーカイブページも見てください。

Powered by
Movable Type 3.35