我正在尝试为简单的通用类型实现Add
:
use std::ops::Add;
pub struct Vector2<T> {
x: T,
y: T,
}
impl<T> Vector2<T> {
fn new(x: T, y: T) -> Self {
Vector2::<T> { x, y }
}
}
impl<T: Add> Add<Vector2<T>> for Vector2<T> {
type Output = Vector2<T>;
fn add(self, other: Vector2<T>) -> Vector2<T> {
let x = self.x + other.x;
let y = self.y + other.y;
Vector2::<T> {
x: self.x + other.x,
y: self.y + other.y,
}
}
}
结果如下:
error[E0308]: mismatched types
--> src/main.rs:22:16
|
22 | x: self.x + other.x,
| ^^^^^^^^^^^^^^^^ expected type parameter, found associated type
|
= note: expected type `T`
found type `<T as std::ops::Add>::Output`
如果我正确解释了这句话,那就是在说“您说您给了我T
,但我所拥有的只是T + T
的结果,而我没有能见度来知道是否是T
。”
我如何向编译器解释T
不仅实现Add,
,而且实现返回相同类型的方式?
答案 0 :(得分:4)
您面临的问题是通用T
+相同的T
不一定是T
。
您的Add
暗示必须看起来像这样:
impl<T: Add> Add<Vector2<T>> for Vector2<T> {
type Output = Vector2<<T as Add>::Output>;
fn add(self, other: Vector2<T>) -> Self::Output {
Vector2 {
x: self.x + other.x,
y: self.y + other.y,
}
}
}