##sortメソッドを学ぶにあたり、はじめに特殊な比較演算子 『<=>演算子』を復習しましょう!
###比較演算子(<=>)とは?
a <=> b
a が b より大きいなら正の整数
a と b が等しいなら 0
a が b より小さいなら負の整数
a と b が比較できない場合は nilを返す
##では、sortメソッドを学んで行きましょう!
numbers = [9, 4, 1, 5, 2, 3, 10, 6, 4, 8]
numbers.sort
=> [1, 2, 3, 4, 4, 5, 6, 8, 9, 10]
sortメソッドは新しい配列を返します。
要素の比較には、上で説明した比較演算子(<=>演算子)が用いられられて、
「a <=> b]を行い、a < bであれば、負の整数を返し、aが先に来る。a=bであれば、0を返し、同じ。a>bであれば、正の整数を返し、bが先となる。
このような処理の結果として、配列オブジェクトの要素は昇順に並び替えられます。
##少し発展した形も学んで見ましょう!
numbers = [2, 8, 7, 3, 6, 10, 1, 4, 5, 9]
numbers.sort {|a, b| b <=> a }
=> [10, 9, 8, 7, 6, 5, 4, 3, 2, 1]
sortメソッドにブロックを渡すと、<=>演算子の代わりにブロックの戻り値によって要素をソートします。ブロック引数a、 bには、比較する2要素が入ります。ブロックの戻り値が負の整数ならaが先、0なら同じ、正の整数ならbが先となります。このような結果として降順に並び替えられます。
##最後に
sortメソッドは、初学者にとって非常に理解しづらいと思いますが、基本を抑えれば、少しずつ使えるようになって行きます。積極的に使って行きましょう!
#追記
みなさんから指摘を受け、sort_byを学習したので、追記します
##sort_byとは?
sortと同じように比較演算子<=>を用いて、並び替えを行うメソッドになります。
sortより優れている点は、拡張性、複雑な処理を行う際の実行の速さがあります。
(https://qiita.com/techno-tanoC/items/f64663eb9b6c0aa3dc37)
##sort_byの書き方
配列オブジェクトorハッシュオブジェクト.sort_by{|item| block }
流れとしては、
①配列オブジェクトorハッシュオブジェクトの要素を一つずつ変数(||)に代入する
②blockにて処理を行う
③ブロックの戻り値を並び替える(<=>が動いている)
###配列オブジェクトのケース
fruits = ["strawberry", "orange", "apple"]
p fruits.sort_by{|fru| fru.size}
=>["apple", "orange", "strawberry"]
要素を一つずる変数に代入し、変数を文字数で並び替えを行う。
###ハッシュオブジェクトのケース
fruits = {strawberry: 120, orange: 39, apple:60}
p fruits.sort_by{|k,v| v}
=>[[:orange, 39], [:apple, 60], [:strawberry, 120]]
変数を二つ指定している理由として、キー、バリューをどちらも代入するためである。比較対象にしたい方をブロックに代入し、その返り値に基づき、並び替えを行う。