特质限制在一般特征上

时间:2014-07-12 16:47:31

标签: generics traits rust

我想知道如何创建绑定到通用特征的泛型函数。

在这个例子中,我选择了BitXorstd::ops::BitXor的声明为BitXor<RHS, Result>

所以,如果我们有我们的功能:

fn e<T: BitXor>(m:T, k:T) -> T {
    m ^ k
}

编译器会抱怨:

error: Wrong number of type arguments: expected 2 but found 0.

所以我试过了:

fn e<T: BitXor<U, V>, U, V>(m:T, k:T) -> T {
    m ^ k
}

但是得到了相当混乱的错误:

Mismatched types: expected `U` but found `T` (expected type parameter but found type parameter).

任何解决方案?

1 个答案:

答案 0 :(得分:2)

这里是BitXor特征的完整定义:

#[lang="bitxor"]
pub trait BitXor<RHS, Result> {
    fn bitxor(&self, rhs: &RHS) -> Result;
}

注意rhs操作数的类型是&RHS。在您的情况下,RHSU(因为您有BitXor<U, V>),而krhs通过^运算符传递的T ,类型为Result。同样,结果是V类型,在您的情况下为T,但您的函数返回fn e<T: BitXor<U, V>, U, V>(m: T, k: U) -> V { m ^ k }

根据您的使用情况,有两种可能的签名:

fn e<T: BitXor<T, T>>(m: T, k: T) -> T {
    m ^ k
}

在这一篇中,我们使用更多类型参数来获得最大的通用性。

{{1}}

在这一个中,我们牺牲了通用性来将所有值限制为相同的类型。