neb*_*ars 5 generics traits rust trait-objects
在 Rust 中,您可以为任何实现其他特征组合的类型自动实现特征。IE:
impl<T: Foo + Bar> SomeTrait for T {
some_function(&self) {
/*...*/
}
}
Run Code Online (Sandbox Code Playgroud)
我想做的是定义一种关系,其中和 都Foo足以Bar自行实现。基本上是这样的:SomeTrait
impl<T: Foo> SomeTrait for T {
some_function(&self) {
/*...*/
}
}
impl<T: Bar> SomeTrait for T {
some_function(&self) {
/*...*/
}
}
Run Code Online (Sandbox Code Playgroud)
这不会编译,因为您要实现SomeTrait两次T,并且编译器不可能知道在 where 的情况下要做什么T: Foo + Bar,但能够做到这一点真是太好了。
有没有某种方法可以“抽象”解决这个问题,以便我可以调用some_function()实现TOR 的Foo方法Bar?或者我是否只能选择一种实现?
如果您每晚使用,则可以使用该marker_trait_attr功能。它允许您为具有 attribute 的特征拥有重叠的实现#[marker]。请注意,该特征不应有关联项 - 它必须为空。
因此,您可以定义一个标记特征FooOrBar(我在私有模块中创建它,因此它是密封的,人们无法手动实现它):
#![feature(marker_trait_attr)]
mod private {
#[marker]
pub trait FooOrBar {}
impl<T: super::Foo> FooOrBar for T {}
impl<T: super::Bar> FooOrBar for T {}
}
Run Code Online (Sandbox Code Playgroud)
然后SomeTrait为任何实现该特征的类型实现该特征FooOrBar:
impl<T: private::FooOrBar> SomeTrait for T {
fn foo(&self) { /* ... */ }
}
Run Code Online (Sandbox Code Playgroud)
游乐场。
不幸的是,为了稳定,我认为除了重新设计之外没有其他办法。