Enumerable
降順で並べ替える最良の方法は何ですか?
私はやってきた@array.sort.reverse
か@array.sort_by{|song| song.title }.reverse
のようなことができると思いますが@array.sort{|a, b| b.title <=> a.title}
、これは読みにくく、冗長です。
Enumerable
降順で並べ替える最良の方法は何ですか?
私はやってきた@array.sort.reverse
か@array.sort_by{|song| song.title }.reverse
のようなことができると思いますが@array.sort{|a, b| b.title <=> a.title}
、これは読みにくく、冗長です。
の性能Array.reverse
はそれほど悪くありません。使用することでコストがかかる@array.sort.reverse
のは、余分な配列の複製とその逆 (n/2 要素の切り替え) です。そうです、あなたがそれがより明確に読めると思うなら、それは受け入れられるべきだと思います.
詳細については、そのソースを参照してください。また、使用すると@array.sort.reverse
読みやすさが「わずかに」向上すると思います(ただし、読むのはそれほど難しくありません)。
これがWayne Conradの自称「明らかながらくた」よりうまく機能するかどうかはわかりませんが、次のEnumerable#sort_by_descending
ように定義できます。
Enumerable.class_eval do
def sort_by_descending(&block)
sort { |a, b| block.bind(b).call <=> block.bind(a).call }
end
end
次に、次のように呼び出します。
@songs.sort_by_descending(&:title)