2013-05-17 8 views
6

ここでは、宇宙船オペレータ<=>を使用しているときのRubyのsortメソッドのプロセスを理解したいと思っています。誰かが助けることを願っています。以下でRubyのソート方法は、比較演算子(宇宙船)とどのように機能しますか?

array = [1, 2, 3] 
array.sort { |a, b| a <=> b } 

...私はsortは一度に数字のペアを比較して、それらが等しいならab0前に属している場合-1を返していることを理解し、または1もしabに従うべきならば。

しかし、降順でソートする場合には、そのよう:

array.sort { |a, b| b <=> a } 

...正確に何が起きているのですか? sortはまだa <=> bを比較し、結果を反転しますか?または、return-1,0、と逆の動作をしていると解釈していますか?言い換えれば

は、なぜこれほどのようなブロック内の変数を置くん:

array.sort { |b, a| b <=> a } 

...最初の例と同じ並び替えパターンにつながりますか?

答えて

4

a <=> baは前bを属している場合、彼らが同じなら、0-1を返します、または1a場合bに従ってください。 baに従わなければならない場合、彼らは同じ、または1ならba0前に属している場合
b <=> a-1を返します。

注文を元に戻すので、出力はたとえば-のように元に戻す必要があります。 3-5-2であり、5-32である。

array.sort { |b, a| b <=> a }は、array.sort { |a, b| a <=> b }に等しい。なぜなら、第1引数は宇宙船の前であり、第2引数は後であるからである。 Rubyは変数の名前が何であるか気にしません。

+0

ブロック変数で指定された順序を参照として使用していますか? – vertigokidd

+0

@vertigokidd Rubyがどの引数を最初の引数とし、どの引数を2番目の引数にするかをRubyがどのように知っていると思いますか?繰り返しになりますが、Rubyは変数名を気にしません。 – Doorknob

+0

@vertigokidd:おそらく、Perlが['sort'ブロック](http://perldoc.perl)で使う魔法の' $ a'と '$ b'変数の前の経験によって混乱しているかもしれません。org/functions/sort.html)。 –

2

ソートはちょうどこの行います

comparison_block.call(elem[i],elem[j]) 

それは知っているか、あなたのブロックが内部でどのように見えるかを気にしますが、それはそれは第二として、最初の引数とどのとして渡された要素を知っている、そしてそれはだていません結果は何に基づいていますか?通常の昇順ソートでは、(1,0)でブロックを呼び出すと1が返されます。それを(0,1)で呼び出すと-1が返されます。注文事項

+0

"ご注文ください。"それは本当に私が聞く必要があるすべてです。ありがとう! – vertigokidd

関連する問題