これつぐです。


[ruby-list:17234] Re: stable sort
> わたなべです.
> 
> 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' },
> :> ]

--中略--

> 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

前にちらっと書きましたが、
これだと ary0.keysort!('age') で死にます。
e.indexes(*keys) が一致すると e で比較しようとするわけですが、
今は e が hash なので比較できない(<=> がない)からです。
あまり変えずに回避するには

-    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}

とかでしょうか?
self.index(e) はちょっとまずいかもしれないので、
each_with_index を使って二行にするとか。

+    each_with_index{|e, i| self[i]=e.indexes(*keys).push(i, e)}
+    sort!.filter{|e| e.pop}