From: gotoken@... (GOTO Kentaro) Date: 1998-06-28T23:36:04+09:00 Subject: [ruby-list:8568] Re: hash sort ごとけんです いやぁ、ふなばさんの Enumerable に対する理解が鋭いので なんかあせって前のメールは難しそうに書いてしまいました ^^; In message "[ruby-list:8561] Re: hash sort" on 98/06/27, Tadayoshi Funaba writes: >ふなばです。 >>現実の要請によって仕方なく sort してしまうけど、枚挙はできても >>本来 sort に馴染まないモノがままあることが Array#<=> への思考を >>阻害しているという考察です。 > >で、このあたりをもうちょっと具体的に聞いてみたいです。 えっと、割とよく会う状況は、ハッシュを要素とする配列で、 ハッシュのキーに対応した値を使ってソートするのだけど、 キーの優先順位だけでは順序を指定できない場合が該当します。 例えば(ちょっとややこしいですが)、 ary.sort!{|e0,e1| if e0[k0] > C && e1[k0] > C e0[k1] <=> e1[k1] elsif e0[k0] > C 1 else e0[k2] <=> e1[k2] end } のような場合です。キーの優先順位が他のキーに対応する 値によって変るわけです。 似たようなケースとして、tree なんかは便宜的に Enumerable にすることがあるけど、leaf かどうかに よってソートの基準を変えるという場合もあります。 つまり nonzero? を使う/使わないという問題とは関係なく Array#<=> は辞書式のような階層的順序が仮定されてるので、 そーゆー階層を導入しにくい場合ですね。 さらに上の例だと最終的に何らかの <=> で解決してますが、 <=> を実装してない場合は nonzero? を使ってその場限りの <=> をブロックに書き込むのは理にかなってると思います。 てゆーか、array.c をみたけど Array#<=> の実装自体が まさに nonzero? 相当のことをやってるわけだし。 上の考察の結論としては既存の <=> の(静的な)階層で 済むときは Array#<=> を積極的に使おうという事ですね。 なるほどー # いや、こんなに議論始めるつもりはなかったんです。 # つき合ってくれてどうもです。 -- gotoken