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でエラーになるがなくなったのだろうか?