如何将 Arc<T> 与 T 进行比较?

Sep*_*eed 5 operator-overloading rust

我试图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
}
Run Code Online (Sandbox Code Playgroud)

操场

我尝试过使用impl Arc<SomeNum>,但你不能对板条箱之外的东西这样做。除此之外,我对 Rust 非常陌生(第 2 天),所以我觉得我错过了一些明显的东西。也许我可以扩展Arc,然后为其实现一些东西?

小智 3

Arc可以用作 asSomeNum因为每当你调用它的函数时它就会被取消引用。如果您查看的文档Arc,您会发现取消引用Arc<T>会产生T.

您已经实现了PartialOrdPartialEq仅适用于 struct SomeNum,因此>仅适用于SomeNum. Arc在比较它们之前,您必须取消引用您的s 。

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;
}
Run Code Online (Sandbox Code Playgroud)