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
、それのために何かを実装することができますか?
あなたは、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;
}
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加