2013-06-18 6 views
6

To nie jest podchwytliwe pytanie:subtelna różnica między rodzajem i 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] 

Co tu się dzieje? Spodziewałbym się, że tablice są naprzeciwko siebie (ponieważ są sortowane i mają te same parametry).

+5

Spójrz: http://ruby-doc.org/core-2.0/Enumerable.html#method-i-sort_by pewno znajdziesz swoją odpowiedź tutaj. W celu uzyskania w przyszłości informacji na ten temat, zapoznaj się z ruby-doc, do którego należysz, aby znaleźć odpowiedź tutaj :) – David

+1

Czytam dokumentację; po prostu nie zauważyłem różnicy między 'sort' i' sort_by'. Ale zawsze doceniam to, że zostałem poinformowany o RTFM. To jest duch StackOverflow. –

Odpowiedz

15

#sort_by powinien po prostu wziąć jeden parametr bloku, element z tablicy i sortuje na podstawie wyniku bloku.

Gdy przepuszczenie dwa parametry bloku, drugi jest ustawiony na nil a zatem wszystkie wyniki blokowe jak 1 <=> nil która nil więc kolejność tablicy jest zmieniana.

[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 ... Chciałem przekazać blok do "sortowania", a nie "sort_by" - które zamiast hałaśliwie wykonuje wszystkie niezwykłe rzeczy, zwłaszcza jeśli sortujesz obiekty (tak jak byłem w moim rzeczywistym kodzie). Twoja odpowiedź była słuszna (i pierwsza), ale wybrałem @ looby's, ponieważ zwrócił uwagę, że 'y = zero' –

+4

nie ma problemu, cieszę się, że jesteś posortowany –