Первый оператор космический корабль <=>
не <==>
Во-вторых, вы не совмещая эти 2 сравнения правильно: результат сравнения будет -1,0 или 1. Это все truthy значения и true && foo
просто foo
, так что ваш код будет просто сортировать по у значения
Вы могли бы написать это как
x_ordering = a.x <=> b.x
x_ordering == 0 ? a.y <=> b.y : x_ordering
Однако массив уже реализует <=>
, так что вы можете просто сделать
array.sort! { |a,b| [a.x, a.y] <=> [b.x, b.y]}
который немного terser и понятнее за счет создания 2 массивов в каждом сравнении
Можно даже сделать
array.sort_by! { |a| [a.x, a.y] }
Это даже яснее, но с немного другим профилем памяти. Это создает массив с исходными значениями, замененными значениями, возвращаемыми блоком, и использует их для сортировки исходного массива.
Обычно я использую последнюю версию, если у меня нет веских оснований для этого.
Вы можете улучшить свой вопрос, добавив короткий ввод и результат вычисления. – radubogdan