Я не понимаю, какое «определение класса» вы хотите. Разве адаптация блока сортировки не решит проблему?
if a.expires == nil
b.expires == nil ? 0 : -1
else
b.expires == nil ? 1 : a.expires <=> b.expires
end
при обновлении
Понимаю. В ruby есть оператор defined?
, который может помочь. Возвращает ноль или строку, представляющую тип элемента (например, «метод»).
if defined? a.expires == nil
(defined? b.expires == nil) ? 0 : -1
else
(defined? b.expires == nil) ? 1 : a.expires <=> b.expires
end
Я пока не очень понимаю, как работают блоки сортировки.
Это легко. Он должен возвращать -1, 0 или 1 в зависимости от того, меньше ли первый элемент, равен или больше второго.
<=>
оператор делает более или менее одно и то же:
1 <=> 2 # result is -1
2 <=> 2 # result is 0
15 <=> 2 # result is 1
обновить снова
У меня работает
class Offer
def initialize(e)
@expires = e
end
def expires
@expires
end
end
offers = [Offer.new(3), Offer.new(1), Offer.new(2), Object.new]
offers.sort! { |a, b|
if (defined? a.expires) == nil
((defined? b.expires) == nil) ? 0 : -1
else
((defined? b.expires) == nil) ? 1 : a.expires <=> b.expires
end
}
puts offers.inspect
Ваша ошибка указывает, что a.expires
имеет тип Offer
, который нельзя сравнивать.
Ура для многословия; p
Добро пожаловать на рельсы:)