Dado que este operador reduce las comparaciones a una expresión entera, proporciona la forma de propósito más general para ordenar ascendente o descendente en función de múltiples columnas / atributos.
Por ejemplo, si tengo una variedad de objetos, puedo hacer cosas como esta:
# `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
Este patrón básico se puede generalizar para ordenar por cualquier número de columnas, en cualquier permutación de ascendente / descendente en cada una.
[1,3,2] <=> [2,2,2]
?