我想为多种类型重载操作符特征。在此示例中,3D矢量可能会乘以标量(缩放矢量分量并返回矢量)或另一个矢量(计算点积并返回标量)。
我需要一个与'How can an operator be overloaded for different RHS types and return values?'中提供的解决方案类似的解决方案。这是大致原始代码中已接受解决方案的代码。我删除了引用,因为它们似乎不需要。
use std::ops;
#[derive(Debug)]
struct Vector3D {
x: f32,
y: f32,
z: f32,
}
trait MulVector3D<ResType> {
fn do_mul(self, rhs: Vector3D) -> ResType;
}
impl MulVector3D<Vector3D> for f32 {
fn do_mul(self, rhs: Vector3D) -> Vector3D {
Vector3D {
x: self * rhs.x,
y: self * rhs.y,
z: self * rhs.z,
}
}
}
impl MulVector3D<f32> for Vector3D {
fn do_mul(self, rhs: Vector3D) -> f32 {
self.x * rhs.x + self.y * rhs.y + self.z * rhs.z
}
}
impl<ResType, RHS: MulVector3D<ResType>> ops::Mul for Vector3D {
fn mul(self, rhs: RHS) -> ResType {
rhs.do_mul(self)
}
}
fn main() {
let a = Vector3D {
x: 1.0,
y: 2.0,
z: 3.0,
};
let b = a * -1.0;
let c = a * b;
println!("{:?}", a);
println!("{:?}", b);
println!("{:?}", c);
}
然而,这对我来说似乎不起作用,我想知道语言规范是否因此而改变。我收到以下错误消息:
error[E0207]: the type parameter `ResType` is not constrained by the impl trait, self type, or predicates
--> src/main.rs:31:6
|
31 | impl<ResType, RHS: MulVector3D<ResType>> ops::Mul for Vector3D {
| ^^^^^^^ unconstrained type parameter
error[E0207]: the type parameter `RHS` is not constrained by the impl trait, self type, or predicates
--> src/main.rs:31:15
|
31 | impl<ResType, RHS: MulVector3D<ResType>> ops::Mul for Vector3D {
| ^^^ unconstrained type parameter
我做了一些搜索,说实话,我甚至不知道如何紧凑地说出这个问题以获得有意义的答案。 AFAIK,ResType
模板参数确实不受约束,但我不明白为什么这是一个问题。至于RHS
,实际上这限制了实现MulVector3D<ResType>
特征。所以再一次,我没有看到错误消息试图告诉我的内容。
你能解释一下这个错误消息吗?实际上我可能会尝试做什么,或者因为某些语言改变原来的问题而被禁止了?