Generics 是否可以自动实现将一个trait对象强制转换为另一个trait对象的trait?

Generics 是否可以自动实现将一个trait对象强制转换为另一个trait对象的trait?,generics,rust,traits,boilerplate,trait-objects,Generics,Rust,Traits,Boilerplate,Trait Objects,我有一个trait可以管理到不同trait对象的转换。 特征如下:(Boo和Gee都是不同的特征) 如果我只有一个特性需要使用泛型转换,我可以这样做: impl<T: Boo> Foo for T { fn as_boo(&mut self) -> Option<&mut Boo> { Some(self) } } 也许可以通过使用来实现这一点,但我找不到任何关于它们的深入解释,所以我现在有点卡住了。这个问题可以通过

我有一个trait可以管理到不同trait对象的转换。 特征如下:(
Boo
Gee
都是不同的特征)

如果我只有一个特性需要使用泛型转换,我可以这样做:

impl<T: Boo> Foo for T {
    fn as_boo(&mut self) -> Option<&mut Boo> {
        Some(self)
    }
}

也许可以通过使用来实现这一点,但我找不到任何关于它们的深入解释,所以我现在有点卡住了。

这个问题可以通过以下方式解决:


据我所知,过程宏无法访问类型信息,因此您将无法决定类型是否需要覆盖默认方法。虽然这在
Boo
Gee
接近始终实现的情况下非常有效,但如果不是这样,它仍然需要手动实现。考虑到
as_-gee
在我的程序中大约80%的调用中应该返回
None
,这是一个相当不幸的事实。
#[derive(Boo)]
struct W {}

impl Foo for W {
    fn as_boo(&mut self) -> Option<&mut Boo> {
        Some(self)
    }
}
impl<T: Boo> Foo for T {
    fn as_boo(&mut self) -> Option<&mut Boo> {
        Some(self)
    }
}
// This does not compile because Foo might get implemented twice.
impl<T: Boo> Foo for T {
    fn as_boo(&mut self) -> Option<&mut Boo> {
        Some(self)
    }
}

impl<T: Gee> Foo for T {
    fn as_gee(&mut self) -> Option<&mut Gee> {
        Some(self)
    }
}
trait Boo {}
trait Gee {}

trait FooAsBoo {
    fn as_boo(&mut self) -> Option<&mut Boo> {
        None
    }
}

trait FooAsGee {
    fn as_gee(&mut self) -> Option<&mut Gee> {
        None
    }
}

trait Foo: FooAsBoo + FooAsGee {}

impl<T: Boo> FooAsBoo for T {
    fn as_boo(&mut self) -> Option<&mut Boo> {
        Some(self)
    }
}

impl<T: Gee> FooAsGee for T {
    fn as_gee(&mut self) -> Option<&mut Gee> {
        Some(self)
    }
}

impl<T: FooAsBoo + FooAsGee> Foo for T {} // if there's nothing else in Foo

struct W;
impl Boo for W {}
impl Gee for W {}

fn main() {
    let mut w = W;
    let foo = &mut w as &mut Foo;
    let boo = foo.as_boo();
}
#![feature(specialization)]

trait FooAsBoo {
    fn as_boo(&mut self) -> Option<&mut Boo>;
}

trait FooAsGee {
    fn as_gee(&mut self) -> Option<&mut Gee>;
}

impl<T> FooAsBoo for T {
    default fn as_boo(&mut self) -> Option<&mut Boo> {
        None
    }
}

impl<T> FooAsGee for T {
    default fn as_gee(&mut self) -> Option<&mut Gee> {
        None
    }
}