Como esse operador reduz as comparações com uma expressão inteira, ele fornece a maneira mais geral de classificar crescente ou decrescente com base em várias colunas / atributos.
Por exemplo, se eu tenho uma matriz de objetos, posso fazer coisas assim:
# `sort!` modifies array in place, avoids duplicating if it's large...
# Sort by zip code, ascending
my_objects.sort! { |a, b| a.zip <=> b.zip }
# Sort by zip code, descending
my_objects.sort! { |a, b| b.zip <=> a.zip }
# ...same as...
my_objects.sort! { |a, b| -1 * (a.zip <=> b.zip) }
# Sort by last name, then first
my_objects.sort! { |a, b| 2 * (a.last <=> b.last) + (a.first <=> b.first) }
# Sort by zip, then age descending, then last name, then first
# [Notice powers of 2 make it work for > 2 columns.]
my_objects.sort! do |a, b|
8 * (a.zip <=> b.zip) +
-4 * (a.age <=> b.age) +
2 * (a.last <=> b.last) +
(a.first <=> b.first)
end
Esse padrão básico pode ser generalizado para classificar por qualquer número de colunas, em qualquer permutação de ascensão / descida em cada uma.
[1,3,2] <=> [2,2,2]
?