Types 所有trait对象的默认trait方法实现

Types 所有trait对象的默认trait方法实现,types,rust,traits,default-implementation,trait-objects,Types,Rust,Traits,Default Implementation,Trait Objects,我有一个traitMyTrait,我希望所有trait对象&MyTrait彼此可比,而不是其他任何对象。我现在有一个基于 问题是我需要在任何地方使用MyTraitComparable,而不是MyTrait。有没有办法绕过这个问题 use std::any::Any; trait MyTrait {} trait MyTraitComparable: MyTrait { fn as_any(&self) -> &Any; fn equals(&s

我有一个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)
}
使用std::any::any;
性状MyTrait{}
trait我的traitcomparable:我的trait{
fn as_any(&self)->&any;
fn等于(&self,other:&MyTraitComparable)->bool;
}

impl如果您愿意使用夜间编译器和不稳定的功能,可以使用来避免具有两个特性:

#![feature(specialization)]

use std::any::Any;

trait MyTrait {
    fn as_any(&self) -> &Any;
    fn equals(&self, other: &MyTrait) -> bool;
}

default impl<S: 'static + PartialEq> MyTrait for S {
    default fn as_any(&self) -> &Any {
        return self as &Any;
    }

    default fn equals(&self, other: &MyTrait) -> 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 {
        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: &MyTrait, another_obj: &MyTrait) -> bool {
    obj.equals(another_obj)
}
#![专题(专门化)]
使用std::any::any;
性状我的性状{
fn as_any(&self)->&any;
fn等于(&self,other:&MyTrait)->bool;
}

默认情况下,立即将
MyTrait
重命名为
MyTraitBase
并将
MyTraitComparable
重命名为
MyTrait
——瞧!你到处都在使用
MyTrait
。@Shepmaster也许有点改进,谢谢,但不是到处都是,因为所有的结构都必须实现MyTraitBase
。虽然我不每晚都使用,但知道有一个正在考虑的解决方案还是很好的!