Поскольку этот оператор сводит сравнения к целочисленному выражению, он предоставляет наиболее общий способ сортировки по возрастанию или убыванию на основе нескольких столбцов / атрибутов.
Например, если у меня есть массив объектов, я могу делать такие вещи:
# `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
Этот базовый шаблон можно обобщить для сортировки по любому количеству столбцов в любой перестановке по возрастанию / убыванию каждого.
[1,3,2] <=> [2,2,2]
?»