Я пытаюсь реализовать набор признаков таким образом, чтобы я мог проверить равенство между типами.Я следовал Как проверить на равенство между чертами объектов? .Я могу использовать метод tr_eq
для проверки типов, но не могу заставить работать оператор ==
.Что я тут не так делаю?
use std::any::Any;
use std::fmt::Debug;
pub trait Obj<'a>: Debug + Any {
fn as_any(&self) -> &Any;
fn tr_eq(&self, other: &Obj) -> bool;
}
impl<'a> Obj<'a> for bool {
fn as_any(&self) -> &Any {
self
}
fn tr_eq(&self, other: &Obj) -> bool {
other
.as_any()
.downcast_ref::<bool>()
.map_or(false, |a| self == a)
}
}
impl<'a> PartialEq for Obj<'a> {
fn eq(&self, other: &Obj) -> bool {
self.tr_eq(other)
}
}
#[derive(Debug, PartialEq)]
pub struct Marker;
impl<'a> Obj<'a> for Marker {
fn as_any(&self) -> &Any {
self
}
fn tr_eq(&self, other: &Obj) -> bool {
other
.as_any()
.downcast_ref::<Marker>()
.map_or(false, |a| self == a)
}
}
fn main() {
println!("true == Marker: {:?}", true == Marker {}); // error
println!("true == true: {:?}", true == true);
println!(
"&true as &Obj == &Marker as &Obj: {:?}",
&true as &Obj == &Marker {} as &Obj
);
println!("Marker.tr_eq(&true): {:?}", Marker {}.tr_eq(&true));
println!(
"&Marker as &Obj == (&true as &Obj): {:?}",
&Marker {} as &Obj == (&true as &Obj)
);
println!("false.tr_eq(&true): {:?}", false.tr_eq(&true));
println!("true.tr_eq(&true): {:?}", true.tr_eq(&true));
println!("Marker==Marker: {:?}", Marker {} == Marker {})
}
error[E0308]: mismatched types
--> src/main.rs:47:46
|
47 | println!("true == Marker: {:?}", true == Marker {});
| ^^^^^^^^^ expected bool, found struct `Marker`
|
= note: expected type `bool`
found type `Marker`