我有一个 trait MyTrait
,我希望所有的 trait 对象&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
,那么我将无法再创建特征对象。