From: Yukihiro Matsumoto <matz@...>
Date: 2010-11-27T23:19:16+09:00
Subject: [ruby-dev:42643] Re: Enumerable#categorize

まつもと ゆきひろです

In message "Re: [ruby-dev:42638] Enumerable#categorize"
    on Sat, 27 Nov 2010 18:45:03 +0900, Tanaka Akira <akr@fsij.org> writes:

|enumerable から hash を生成するメソッドとして
|Enumerable#categorize を追加するのはどうでしょうか。

Enumerableからhashを生成するメソッドはちょうど昨日欲しいと思っ
たばかりなので、そういうメソッドの必要性は理解します。が、
categorize よりも先に「要素をブロックに渡して、そのブロックの
生成値によってハッシュを作るメソッド」が欲しいです。

つまり、

|  ary = [
|    ["matz", "Yukihiro Matsumoto"],
|    ["nobu", "Nobuyoshi Nakada"],
|    ["akr", "Tanaka Akira"],
|    ["usa", "Usaku NAKAMURA"],
|    ["naruse", "NARUSE, Yui"],
|    ["ko1", "SASADA Koichi"]
|  ]

  h = ary.xxx{|e| [e[1],e[0]]}
  #=> {"Yukihiro Matsumoto"=>["matz"],
       "Nobuyoshi Nakada"=>["nobu"],
       "Tanaka Akira"=>["akr"],
       "Usaku NAKAMURA"=>["usa"],
       "NARUSE, Yui"=>["naruse"],
       "SASADA Koichi"=>["ko1"]}

です。まだxxxに該当する適切な名前を思いついていませんが。これ
は(デフォルトでは)Enumerableの要素が配列であることを仮定して
いる categorize よりも汎用的ではないかと思います。

いや、 categorize は不要だとかまでは主張しませんが、こっちが
先に欲しいです。

|* ネストしたハッシュの生成
|* ハッシュの値の後処理
|* :seed, :op, :update オプション
|* 複数の値を取り出す

私の提案ではこの辺は対応できないので、 categorize の意味はあ
るとは思います。

で、このメソッドの適切な名前はなんでしょうね。make_mapとか考
えたのですが、美しくない。Lispとかに似たような関数なかったっ
けな。

                                まつもと ゆきひろ /:|)