これつぐです。


いっそのこと Array#sort の仕様をかえるというのはどうでしょう。
たとえばこんなふうに。

  sort
  sort!
  sort {|e|...}
  sort! {|e|...}
      配列の内容をソートします.ブロックを与えて呼び出された時には
      各要素をブロックで評価した結果で比較します.ブロックがない時には
      <=>演算子を使って比較します.sortはソートされた新しい配列を返し,
      sort!は配列の内容をその場でソートします.


CはわからないのでRubyレベルで書くとこんな感じ……?

class Array

  alias _sort! sort!
  alias _sort sort

  def sort!
    if iterator?
      filter{|e| [yield(e), e]}._sort!.filter{|e| e.pop}
    else
      _sort!
    end
  end

  def sort
    if iterator?
      dup.sort!{|e| yield(e)}
    else
      _sort
    end
  end

end


こうすれば

ary.sort{|e| e.downcase}
ary.sort{|e| [e.to_i, e.to_s, e.to_f]}
ary.sort{|e| [e['name'], e['age']]}

という風に書けます。

仕様変更はさすがにおおげさなので
SchwartzianTransform.rbを添付とか?(←長すぎ)