我正在尝试将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的新手(第二天),所以我觉得自己缺少明显的东西。也许我可以扩展Arc
,然后为其实现内容?
您的Arc
可以用作SomeNum
,因为只要您在其上调用函数,它就会被取消引用。如果查看documentation of Arc
,将会看到对Arc
的解引用会导致Arc<T>
。
您仅对结构T
实现了PartialOrd
和PartialEq
,因此SomeNum
仅适用于>
。比较之前,您必须先取消引用SomeNum
。
Arc