Quantcast
Channel: User Mark - Stack Overflow
Viewing all articles
Browse latest Browse all 44

Default trait method implementation for all trait objects

$
0
0

I have a trait MyTrait, and I want all trait objects &dyn MyTrait to be comparable to each other and to nothing else. I have that now based on How to test for equality between trait objects?.

The problem is that I need to use MyTraitComparable everywhere, instead of MyTrait. Is there a way to get around this?

use std::any::Any;trait MyTrait {}trait MyTraitComparable: MyTrait {    fn as_any(&self) -> &dyn Any;    fn equals(&self, other: &dyn MyTraitComparable) -> bool;}impl<S: 'static + MyTrait + PartialEq> MyTraitComparable for S {    fn as_any(&self) -> &dyn Any {        self as &dyn Any    }    fn equals(&self, other: &dyn MyTraitComparable) -> bool {        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 {        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: &dyn MyTraitComparable, another_obj: &dyn MyTraitComparable) -> bool {    obj.equals(another_obj)}

I tried moving as_any and equals to MyTrait and providing a default implementation, but

  • I don't think I can use self in that case, so it doesn't work.
  • If I use trait MyTrait: PartialEq then I can't create trait objects anymore.

Viewing all articles
Browse latest Browse all 44

Trending Articles



<script src="https://jsc.adskeeper.com/r/s/rssing.com.1596347.js" async> </script>