如何实现 T where T: Foo OR Bar 的特征

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?或者我是否只能选择一种实现?

Cha*_*man 3

如果您每晚使用,则可以使用该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)

游乐场

不幸的是,为了稳定,我认为除了重新设计之外没有其他办法。