Enumerable#sort_by.reverse

hash = {:a => 30, :b => 50, :c => 40, :d => 20}
hash.sort_by {|k, v| v }.reverse

キーを単語、値を単語の出現回数とするハッシュをつくっていじくりまわしたりすることがある。そして出現回数でソートして Array#reverse で昇順に、ということをやることがある。

ふと、そういうコードを書いていて、 Enumerable#sort_by の段階で大小比較を反転できればいいんじゃないか、ということに思い至り、数値 (Numeric) の比較なら Numeric#-@ を使えばよい気がする。

hash.sort_by {|k, v| -v }

しかし、数値以外だとやっぱり Array#reverse するしかないし、残念だ。