Я решил дать ответ, который, я надеюсь, будет понятен большинству новичков в Ruby.
Array#sort сравнивает каждую пару элементов в массиве. Для каждой пары элементов x,y
блок sort
возвращает -1
, если x
предшествует y
в сортировке, 1
, если y
предшествует x
, и 0
, если один из них может предшествовать другому. Если блок не задан, sort
использует блок:
{ |x,y| x <=> y }
Если, например, x
и y
являются строками, метод String#‹=> можно определить следующим образом:
class String
def <=>(other)
case
when self < other then -1
when self > other then 1
else 0
end
end
end
Аналогично, Array#‹= > вызывается, если x
и y
являются массивами и т. д. Для Fixnum
s, Bignum
s и Float
s (все из классов, происходящих от Numeric
), метод Numeric#‹=>, поэтому сортируемый массив может содержать смесь этих трех типов данных.
Если блок sort
:
{ |x,y| y <=> x }
блок возвращает показанные здесь значения (со значениями по умолчанию x <=> y
, показанными для сравнения):
Теперь предположим, что мы хотим отсортировать массив [2,3,1,2]
. Для значения по умолчанию sort
блок сортировки с x <=> y
возвращает показанные здесь значения:
что заставляет sort
возвращать [1,2,2,3]
. Если блок сортировки
{ |x,y| y <=> x }
блок сортировки возвращает следующие значения:
заставляя sort
возвращать [3,2,2,1]
.
person
Cary Swoveland
schedule
11.07.2014