わたなべです. nobu.nakada / nifty.ne.jp <nobu.nakada / nifty.ne.jp> writes: :At Tue, 28 Sep 1999 17:39:26 +0900, :OHARA Shigeki <os / iij.ad.jp> wrote: :> ary0 = [ :> { 'name' => 'angie', 'age' => '20' }, :> { 'name' => 'charlie', 'age' => '19' }, :> { 'name' => 'bob', 'age' => '20' }, :> ] : : ふつーはこいつの singleton にしませんか。 やっぱもう一個 sort しなきゃいけない配列が出てきちゃったって ことになりがちなので module にして extend とか. :あと何故に age が文字列? 名前が「金さん」とか「銀さん」だったりすると年齢が文字列だと まずいよね. : def sort!(*keys) : each_with_index{|e, i| self[i] = e.indexes(*keys).push(i, e)}.sort!.filter{|e| e.pop} : end each_with_index は常に nil を返すから nil.sort! でエラーになります. なんとなく sort! の前に改行があってもともと 2 行だったのを むりやり 1 行にした時点でミスったものと思われます. でもそれじゃ sort! が再帰的に呼ばれちゃうから原因は別にあるのかな. ていうか無理に sort という名前にこだわらなくてもいいよね? module Keyssort def keyssort!(*keys) filter{|e| [e.indexes(*keys), e]}.sort!.filter{|e| e.pop} end def keyssort(*keys) dup.keyssort!(*keys) end end ary0.extend Keyssort ary0.keyssort!('age', 'name') p ary0 Schwartzian Transform って Perl じゃなくて Ruby に向いているのかも. 配列の配列をそのまま sort できるというのはやっぱり便利だ. -- わたなべひろふみ