わたなべです.

Koretsugu Daigoro <tmmcross / hk.airnet.ne.jp> writes:

:これだと ary0.keysort!('age') で死にます。
:e.indexes(*keys) が一致すると e で比較しようとするわけですが、
:今は e が hash なので比較できない(<=> がない)からです。

なるほど. これこそいわゆる stable な sort にしなきゃってことですね.

:あまり変えずに回避するには
:
:-    filter{|e| [e.indexes(*keys), e]}.sort!.filter{|e| e.pop}
:+    filter{|e| [e.indexes(*keys), self.index(e), e]}.sort!.filter{|e| e.pop}
:
:とかでしょうか?

どうせ順番に出てくるわけだから
    i = 0
    filter{|e| [e.indexes(*keys), i += 1, e]}.sort!.filter{|e| e.pop}
で十分です. たぶん.
でも自分の好みだとこうしちゃうかも.

module Keyssort
  def with_index
    i = -1
    filter do |x|
      [x, i += 1]
    end
  end
  def keyssort!(*keys)
    with_index.filter{|e, i| [e.indexes(*keys), i, e]}.sort!.filter{|e| e.pop}
  end
  def keyssort(*keys)
    dup.keyssort!(*keys)
  end
end

ary0.extend Keyssort
ary0.keyssort!('age')
p ary0

-- 
わたなべひろふみ