我如何比较Arc 与T?

问题描述 投票:2回答:1

我正在尝试将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
}

playground

我曾尝试使用impl Arc<SomeNum>,但您不能在板条箱以外的地方这样做。除此之外,我还是Rust的新手(第二天),所以我觉得自己缺少明显的东西。也许我可以扩展Arc,然后为其实现内容?

rust operator-overloading automatic-ref-counting
1个回答
1
投票

您的Arc可以用作SomeNum,因为只要您在其上调用函数,它就会被取消引用。如果查看documentation of Arc,将会看到对Arc的解引用会导致Arc<T>

您仅对结构T实现了PartialOrdPartialEq,因此SomeNum仅适用于>。比较之前,您必须先取消引用SomeNum

Arc
© www.soinside.com 2019 - 2024. All rights reserved.