Generics 是否可以自动实现将一个trait对象强制转换为另一个trait对象的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) } } 也许可以通过使用来实现这一点,但我找不到任何关于它们的深入解释,所以我现在有点卡住了。这个问题可以通过
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
}
}