Как сравнить Ar c<T> с T? - PullRequest
       9

Как сравнить Ar c<T> с T?

2 голосов
/ 27 февраля 2020

Я пытаюсь трактовать Arc больше как базовые данные, в частности я пытаюсь использовать перегруженные операторы. Следующий код выдает ошибки , но это была моя попытка.

use std::cmp::Ordering;
use std::option::Option;
use std::sync::Arc;

pub struct SomeNum {
    num: u32,
}

impl std::cmp::PartialEq<u32> for SomeNum {
    fn eq(&self, other: &u32) -> bool {
        return *other == self.num;
    }
}

impl std::cmp::PartialOrd<u32> for SomeNum {
    fn partial_cmp(&self, other: &u32) -> Option<Ordering> {
        if (self.num < *other) {
            return Option::Some(Ordering::Less);
        }
        if (self.num > *other) {
            return Option::Some(Ordering::Greater);
        }
        return Option::Some(Ordering::Equal);
    }
}

fn main() {
    let test_num = SomeNum { num: 16 };
    let oveloadedNum = test_num > 10; // works

    let arc_num = Arc::new(test_num);
    let overloadedArc = arc_num > 10; // fails

    let arc_num_clone = Arc::clone(&arc_num);
    let overloadedArcClone = arc_num_clone > 10; // fails
}

детская площадка

Я пытался использовать impl Arc<SomeNum>, но вы не можете сделать что для вещей за пределами вашего ящика. Кроме того, я очень плохо знаком с Rust (день 2), поэтому я чувствую, что упускаю что-то очевидное. Возможно, я мог бы расширить Arc, а затем реализовать что-то для этого?

1 Ответ

1 голос
/ 27 февраля 2020

Ваш Arc может использоваться как SomeNum, потому что он разыменовывается, когда вы вызываете функцию для него. Если вы посмотрите на документацию Arc, вы увидите, что разыменование Arc<T> приводит к T.

Вы реализовали PartialOrd и PartialEq только для структуры SomeNum, поэтому > будет работать только с SomeNum. Вы должны разыменовать ваши Arc с, прежде чем сравнивать их.

fn main() {
    let test_num = SomeNum { num: 16 };
    let oveloadedNum = test_num > 10; // works

    let arc_num = Arc::new(test_num);
    let overloadedArc = *arc_num > 10;

    let arc_num_clone = Arc::clone(&arc_num);
    let overloadedArcClone = *arc_num_clone > 10;
}
...