如何向编译器解释T以返回相同类型的方式实现Add的方法?

时间:2018-07-30 07:17:01

标签: rust

我正在尝试为简单的通用类型实现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,,而且实现返回相同类型的方式?

1 个答案:

答案 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,
        }
    }
}