В вашем примере
a.sort
эквивалентно
a.sort { |x, y| x <=> y }
Как вы знаете, для сортировки массива вам нужно иметь возможность сравнивать его элементы (если вы сомните, что просто попробуйте реализовать любой алгоритм сортировки без какого-либо сравнения, нет <
, >
, <=
или >=
).
Предоставляемый вами блок действительно является функцией, которая будет вызывается алгоритмом sort
для сравнения двух элементов. Это x
и y
всегда будут некоторыми элементами входного массива, выбранными алгоритмом sort
во время его выполнения.
Алгоритм sort
будет считать, что эта функция сравнения / блок будет соответствуют требованиям метода <=>
:
Неспособность обеспечить адекватную функцию сравнения / блок приведет к массив, порядок которого не определен.
Теперь вы должны понять, почему
a.sort { |x, y| x <=> y }
и
a.sort { |x, y| y <=> x }
возвращают тот же массив в противоположных порядках.
Чтобы узнать, что добавил Тейт Джонсон, если вы реализуете функцию сравнения <=>
на любом из ваших классов, вы получаете следующее
Comparable
в вашем классе, который автоматически определит для вас следующие методы: between?
, ==
, >=
, <
, <=
и >
. sort
. Обратите внимание, что метод <=>
уже предоставляется везде, где это имеет смысл в стандартной библиотеке Ruby (Bignum
], Array
, File::Stat
, Fixnum
, String
, Time
и т. д.).
Небольшое исследование показывает, что: