さっそく、sort_byを読んでみた

非常にお洒落な使い方
満足せる豚。眠たげなポチ。:[Ruby] テーブルっぽいデータをシンプルにソートする
 
ちょっとsort_byメソッドに注目してみる。
Rubyにはsortメソッドがあるが、何度も評価してしまうので効率が悪い。
sort_byだと一度全ての項目を評価してしまって、比べてやるということだ。
 

[4,2,3].sort{|a,b| b.next <=> a.next}
                  #↑               ↑ここの部分が繰り返し使われる
=>[2,3,4]

#バブルソートだと思われるのでこんな感じかなぁ。
class Array
  def sort
    ar = self.clone
    (ar.size).times do |i|
      (ar.size - 1).times do |j|
        if yield(ar[j], ar[j - 1]) > 0 #ここですっごい評価されちゃうから
          d = ar[j]
          ar[j] = ar[j - 1]
          ar[j - 1] = d
        end
      end
    end
    ar.unshift(ar.pop)
  end
end

 
そして、これがsort_byと同等のソースらしい。

[4,2,3].sort_by{|a| a.next}
=>[2,3,4]

class Array
  def sort_by
    self.collect {|i| [yield(i), i] }.   #[[5, 4], [3, 2], [4, 3]]のデータに変える
       sort {|a,b| a[0] <=> b[0] }.      #要素1でソートしてから
       collect! {|i| i[1]}               #要素2を配列にして返す
  end
end

 
ん〜、おしゃれね。

追記
Rubyのsortはバブルソートじゃなくてクイックソートだそうです。(常識だってさ)