为通用特征实现特征

时间:2021-01-08 02:02:26

标签: rust

在 Rust 中,如何为通用 trait 实现 Trait?

trait One<S> {}

trait Two {}

// fails because S isn't contrained
impl<S, T> Two for T where T: One<S> {}

为了澄清,我正在尝试提供 BitAnd 特性 用于通用 Select 特征。

struct Thing<S> {
    field: S,
}

trait Select<S> {
    fn select(&self, thing: &Thing<S>) -> bool;
}

struct SelectUnion<S> (Box<dyn Select<S>>, Box<dyn Select<S>>);

// fails because S isn't contrained
impl<S, T> std::ops::BitAnd for T where T: Select<S> {
    type Output = SelectUnion<S>;

    fn bitand(self, rhs: Self) -> Self::Output {
        SelectUnion(Box::new(self), Box::new(rhs))
    }
}

1 个答案:

答案 0 :(得分:0)

不可能,原因是它会模棱两可。

想想这样的情况:

struct A;

impl One<u16> for A {}

impl One<u32> for A {}

One 将基于两个 Two 实现中的哪一个?两者都满足一揽子 Two 实现的先决条件,但 Two 只能为任何类型实现一次。就像您提供两个单独的 impl Two for A 块一样。


在问题澄清后编辑:

以上仍然成立,但您可能想尝试是否可以将 Select 变成一个类型,可能是通过将它变成一个可选择的包装器。