BinaryHeap, не понимаю почему неправильный элемент

Привет,

Я сделал обёртку над парой (string, i32) и переопределяю Qrd и получаю неожиданный результат:

use std::collections::BinaryHeap;
use std::cmp::Ordering;

#[derive(Copy, Clone, PartialEq, Eq, PartialOrd, Debug)]
struct Q<'a>(&'a str, i32);

impl<'a> Ord for Q<'a> {
    fn cmp(&self, other: &Self) -> Ordering {
        self.1.cmp(&other.1).reverse() // NOTE reverse() here
    }
}

fn main() {

    let mut pq = BinaryHeap::new();
    pq.push(Q("Apples", 5));
    pq.push(Q("Bananas", 8));
    pq.push(Q("Strawberries", 23));

    // but the assertion fails!
    assert_eq!(pq.peek(), Some(&Q("Apples", 5)));
}

Assert фейлится, хотя reverse() явно намекает на обратное.
Что я делаю не так? (Playpen goes here)

UPD: действительно включил reverse()

Уф, грабли оказались связанными с PartialOrd, его тоже нужно определить для Q явно, а неявный инстанс убрать:

impl<'a> PartialOrd for Q<'a> {
    fn partial_cmp(&self, other: &Self) -> Option<Ordering> {
        Some(self.1.cmp(&other.1).reverse())
    }
}

impl<'a> Ord for Q<'a> {
    fn cmp(&self, other: &Self) -> Ordering {
        self.1.cmp(&other.1).reverse() // NOTE reverse() here
    }
}

Модифицированный пример, который работает

1 лайк