Ruby: есть ли лучший способ написать следующий метод "sort"? - PullRequest
1 голос
/ 07 января 2011

Есть ли более хороший (и эквивалентный) способ сортировки таких предметов?

 items.sort! do |p1, p2|
   if (p1.foo == p2.foo)
     if (p1.bar == p2.bar)
       if (p1.moo == p2.moo)
         p1.wow <=> p2.wow               # Ascending order
       else
         p2.sam.moo <=> p1.sam.moo       # Descending order, 2 levels attribute
       end
     else
       p2.bar <=> p1.bar                 # Descending order
     end
   else
     p1.foo <=> p2.foo                   # Ascending order
   end
 end

1 Ответ

3 голосов
/ 07 января 2011

Вы можете превратить объекты в массивы для сравнения

[p1.foo, p1.bar, p1.moo, p1.sam.moo] <=> [p2.foo, p2.bar, p2.moo, p2.sam.moo]

Массивы сравниваются как строки: по первому отличающемуся элементу.

Если в некоторых сравнениях (p2.bar <=> p1.bar) обратные индексы не являются опечатками, вам также придется переключать элементы массива.

Или вы можете переопределить оператор сравнения в вашем классе

  def <=>(p2)
    ...
  end

В этом случае вам не нужно ничего передавать в items.sort!.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...