Метод сортировки в рубине

Я хочу указать метод настраиваемого блока для сортировки массива объектов в ruby, оценив два свойства. Однако после многих поисков в google я не попал ни в один пример без оператора <= > .

Это то, что я хочу сделать: сравнивая vs b:

if a.x less than b.x return -1
if a.x greater than b.x return 1
if a.x equals b.x, then compare by another property , like a.y vs b.y

это мой код (noob в ruby, извините), и он не работает...

ar.sort! do |a,b|
   if a.x < b.y return -1
   elseif a.x > b.x return 1
   else return a.y <=> b.y
end

Этот блок находится внутри функции, поэтому возврат возвращается из функции и возвращает -1... Я буду признателен за любую помощь в этом.

С уважением.

Ответ 1

С выражением case:

ar.sort do |a, b|
  case
  when a.x < b.x
    -1
  when a.x > b.x
    1
  else
    a.y <=> b.y
  end
end 

С тройной:

ar.sort { |a,b| a.x < b.x ? -1 : (a.x > b.x ? 1 : (a.y <=> b.y)) }

Ответ 2

Это даст вам возрастающий порядок для x, тогда для y:

points.sort_by{ |p| [p.x, p.y] }

Ответ 3

Это работает:

# Ascending
ar.sort! do |a,b|
  (a-b).abs() > 0 ? a-b : 0
end

# Descending
ar.sort! do |a,b|
  (a-b).abs() > 0 ? b-a : 0
end

Нет необходимости в операторе космического корабля (<=>) - он кажется излишним в Ruby (в терминах эффективности синтаксиса), поскольку Ruby считает, что 0 является истинным, и для этого использования (выше) вы можете просто поместить явный 0 в тернарный оператор.