私は trait を持っていて、すべての trait オブジェクトを互いに比較できるようにしMyTrait
たいのです。私は今、特性オブジェクト間の同等性をテストする方法に&MyTrait
基づいていますか? .
問題はMyTraitComparable
、代わりにどこでも使用する必要があることですMyTrait
。これを回避する方法はありますか?
use std::any::Any;
trait MyTrait {}
trait MyTraitComparable: MyTrait {
fn as_any(&self) -> &Any;
fn equals(&self, other: &MyTraitComparable) -> bool;
}
impl<S: 'static + MyTrait + PartialEq> MyTraitComparable for S {
fn as_any(&self) -> &Any {
return self as &Any;
}
fn equals(&self, other: &MyTraitComparable) -> bool {
return match other.as_any().downcast_ref::<S>() {
None => false,
Some(a) => self == a,
};
}
}
#[derive(PartialEq)]
struct MyObj {
a: i32,
}
impl MyObj {
fn new(a: i32) -> MyObj {
return MyObj { a };
}
}
impl MyTrait for MyObj {}
fn main() {
assert!(as_trait_obj_and_compare(&MyObj::new(1), &MyObj::new(1)));
}
fn as_trait_obj_and_compare(obj: &MyTraitComparable, another_obj: &MyTraitComparable) -> bool {
obj.equals(another_obj)
}
デフォルトの実装に移動as_any
しequals
て提供しようとしましたが、MyTrait
self
その場合は使えないと思うのでダメです。- 使用する
trait MyTrait: PartialEq
と、特性オブジェクトを作成できなくなります。