Суть вашей проблемы в том, что вы в первую очередь дублируете одни и те же поля в обеих структурах. Этого легко избежать, выделив их в какую-то отдельную структуру, например:
#[derive(Eq, PartialEq)]
struct TimeRange {
start: i32,
end: i32,
}
Тогда вы можете реализовать Ord
& PartialOrd
для него один раз.
impl Ord for TimeRange {
// ...
}
impl PartialOrd for TimeRange {
// ...
}
Так как TimeRange
теперь Ord
, вы можете просто получить черту Ord
для Event
и Reservation
, поскольку она будет делегироваться TimeRange
impl.
#[derive(Eq, PartialEq, Ord, PartialOrd)]
struct Event {
range: TimeRange,
}
#[derive(Eq, PartialEq, Ord, PartialOrd)]
struct Reservation {
range: TimeRange,
}
Кроме того, в Ваш конкретный пример c, который вы, кажется, сначала сортируете по start
, а затем по продолжительности. Но если start
-s равны, то сравнение по длительности эквивалентно сравнению по end
, и, таким образом, вы эффективно сортируете по start
, тогда end
, который по умолчанию Ord
даст вам без необходимости напишите код NAY.