在 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))
}
}
答案 0 :(得分:0)
不可能,原因是它会模棱两可。
想想这样的情况:
struct A;
impl One<u16> for A {}
impl One<u32> for A {}
One
将基于两个 Two
实现中的哪一个?两者都满足一揽子 Two
实现的先决条件,但 Two
只能为任何类型实现一次。就像您提供两个单独的 impl Two for A
块一样。
在问题澄清后编辑:
以上仍然成立,但您可能想尝试是否可以将 Select 变成一个类型,可能是通过将它变成一个可选择的包装器。