sort_by

先日の日記のコメントでsortよりsort_byを使った方が良いとご指摘頂いた。Rubyのsort_byはPythonで言うところのDSUにより実装されているらしい。まとめると以下の通り。

Ruby Python
sort sort(cmp=...)
sort_by sort(key=...)

RubyのEnumerable#sort、Enumerable#sort_byはunstable。Pythonのlist.sortはstableというのも違う。


Rubyでstableなソートを行うには以下のように行うらしい。

i = 0
ary.sort_by {|v| [v, i += 1] }

Pythonに比べてかなり簡潔に書けるが「i = 0」の位置は気に入らない。


先日『ピッケル本 第2版』と『Rubyクックブック』を見ていてコレクション周りと外部イテレータを生成するジェネレータ周りの解説が少ないと思っていたが、コレクション周りはほぼEnumerableに集約されていると思うので、その部分はRubyのリファレンスマニュアルは結構詳しく書いてあると思った。1.9.0での外部イテレータ周りの解説は興味ある人が少ないのかも。


今は1.8.6から1.9.0で大きい変化の時期なので勉強が難しい。callccが1.9.0でエラーになるがなくなったのだろうか?