我想知道如何创建绑定到通用特征的泛型函数。
在这个例子中,我选择了BitXor
。 std::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).
任何解决方案?
答案 0 :(得分:2)
这里是BitXor特征的完整定义:
#[lang="bitxor"]
pub trait BitXor<RHS, Result> {
fn bitxor(&self, rhs: &RHS) -> Result;
}
注意rhs
操作数的类型是&RHS
。在您的情况下,RHS
为U
(因为您有BitXor<U, V>
),而k
是rhs
通过^
运算符传递的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}}
在这一个中,我们牺牲了通用性来将所有值限制为相同的类型。