2013-06-18 5 views
6

Dies ist kein Trick Frage:feiner Unterschied zwischen Art und sort_by

[1,2,3].sort_by { |x, y| x <=> y } 
=> [1, 2, 3] 

[1,2,3].sort_by { |x, y| y <=> x } 
=> [1, 2, 3] 

Was ist hier los? Ich hätte erwartet, dass die Arrays einander gegenüberstehen (wie sie sind mit der Sorte und den gleichen Parametern).

+5

Werfen Sie einen Blick auf: http://ruby-doc.org/core-2.0/Enumerable.html#method-i-sort_by werden Sie auf jeden Fall hier, um Ihre Antwort finden. Für zukünftige Referenz konsultieren Sie die Ruby-Doc Ihr gebunden, um Ihre Antwort hier zu finden :) – David

+1

Ich las die Dokumente; habe gerade den Unterschied zwischen 'sort' und' sort_by' nicht bemerkt. Aber ich schätze es immer, wenn ich dem RTFM gesagt werde. Das ist der Geist von StackOverflow. –

Antwort

15

#sort_by sollte nur einen Blockparameter, ein Element aus dem Array, und Sortierungen basierend auf dem Ergebnis des Blocks.

Wenn es zwei Block Parameter übergeben, wird der zweite zu nil und damit alle Blöcken Ergebnisse sind wie die 1 <=> nilnil unverändert ist, so dass die Reihenfolge der Anordnung eingestellt ist.

[1, 3, 2].sort_by { |x| x } # sorts using x <=> y 
=> [1, 2, 3] 

[1, 3, 2].sort_by { |x, y| x <=> y } # sorts using nil <=> nil 
=> [1, 3, 2] 
4
[1,2,3].sort_by { |x| x } 
=> [1, 2, 3] 

[1,2,3].sort_by { |x| -x } 
=> [3, 2, 1] 

[1,2,3].sort 
=> [1, 2, 3] 

[1,2,3].sort.reverse 
=> [3, 2, 1] 

[1,2,3].sort { |x, y| x <=> y } 
=> [1, 2, 3] 

[1,2,3].sort { |x, y| y <=> x } 
=> [3, 2, 1] 
+0

Duh ... Ich wollte den Block an 'sort' übergeben, nicht an' sort_by' - was, anstatt laut zu tun, alle möglichen ungewöhnlichen Dinge tut, besonders wenn du Objekte sortierst (so wie ich in meinem eigentlichen Code war)). Ihre Antwort war richtig (und zuerst), aber ich wählte @ Looby, weil er darauf hingewiesen, dass "y = Null" –

+4

kein Problem, froh, dass Sie sortiert sind –