わたなべです.

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 できるというのはやっぱり便利だ.

-- 
わたなべひろふみ