Rubyのsortでハマった

某プログラミング問題サイトで回答のコード書いてたのだが、配列のソートを含むコードの挙動がどう考えてもおかしい感じになって軽くハマったのでメモ

例えば下記の例

["34","10","101"].sort

これは当然["10","34","101"]になるだろうと思いきや、

irb(main):001:0> ["34","10","101"].sort
=> ["10", "101", "34"]

こうなりますと。
分かる人には当たり前なんだろうけど、文字列だとこうなってしまうんですね…

正しくやるにはsortにブロック渡すか、数字に変換してからsortするとか

#sortにブロック渡す場合
["34","10","101"].sort {|a,b| a.to_i <=> b.to_i}
 #=> ["10", "34", "101"]

#数字に変換する場合
array = ["34","10","101"]
array.map! {|m| m.to_i}
array.sort 
# => [34, 10, 101]

ちなみに数字に変換する場合は結果がIntegerの配列になる。
文字列の配列であることに意味があるならブロックで渡すべきかも。

なんにせよこんなことにハマるなんて残念すぎた…