Реализация PartialEq для сравнения объектов разных черт - PullRequest
0 голосов
/ 31 мая 2018

Я пытаюсь реализовать набор признаков таким образом, чтобы я мог проверить равенство между типами.Я следовал Как проверить на равенство между чертами объектов? .Я могу использовать метод 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`
...