From: "とみたまさひろ" Date: 2010-06-29T00:28:41+09:00 Subject: [ruby-dev:41760] Hash[] の引数が Array の場合の振る舞い とみたです。 Hash[] の引数が1つの配列で、かつその要素がさらに 1個か2個の要素の配列 の場合、それをキーと値のペアとみなして(1個の場合は値は nil)、Hash オブ ジェクトを生成するようです。 ary = [[1,2],[3,4],[5]] Hash[ary] #=> {5=>nil, 1=>2, 3=>4} 1.8.7 でも 1.9.2 でも同様です。 マニュアル http://doc.okkez.net/static/187/class/Hash.html にはこの用法 は載っていませんでした。 というか、次の記述があったのですが、 | (4) キーや値が配列だと (2) や (3) の方法は使えないので地道に代入するしかない | | h = Hash.new | alist = [[1,["a"]], [2,["b"]], [3,["c"]]] | alist.each {|k,v| | h[k] = v | } | p h | | #=> {1=>["a"], 2=>["b"], 3=>["c"]} 今回みつけた方法を使うと、次のように簡単に Hash を作成できます。 alist = [[1,["a"]], [2,["b"]], [3,["c"]]] Hash[alist] #=> {1=>["a"], 2=>["b"], 3=>["c"]} これがマニュアルに載ってないのは、単に漏れているだけでしょうか。それと も何かの事情によりマニュアル未記載が選択されたのでしょうか。 Subversion で追ってみると、次の変更でこの機能が追加されたようです。 ------------------------------------------------------------------------ r13803 | matz | 2007-11-02 15:30:26 +0900 (金, 02 11月 2007) | 8 lines * array.c (rb_ary_assoc): check and convert inner arrays (assocs) using #to_ary. * hash.c (rb_hash_s_create): check and convert argument hash using #to_hash. * hash.c (rb_hash_s_create): Hash#[] now takes assocs as source of hash conversion. ------------------------------------------------------------------------ -- とみたまさひろ D68F 8F55 7F6C 5908 88EB 1EBA 25ED DEE7 BBE8 1752