`method` sub` имеет несовместимый тип для trait` (Может ли sub быть реализован для разных структур?) - PullRequest
0 голосов
/ 01 мая 2020

Я пытаюсь написать 2 структуры Point и Bound, чтобы вы могли вычесть Point из Bound.

Код:

struct Point {
    x:usize,
    y:usize,
}
impl Sub for Point {
    type Output = Point;
    fn sub(self,other:Point) -> Point {
        Point { x:self.x-other.x, y:self.y-other.y }
    }
}
struct Bound { min:Point,max:Point }
impl Sub for Bound {
    type Output = Bound;
    fn sub(self,other:Point) -> Bound {
        Bound { min:self.min-other, max:self.max-other }
    }
}

Я получаю сообщение об ошибке:

method `sub` has an incompatible type for trait

expected struct `construct::Bound`, found struct `construct::Point`

note: expected fn pointer `fn(construct::Bound, construct::Bound) -> construct::Bound`
         found fn pointer `fn(construct::Bound, construct::Point) -> construct::Bound`rustc(E0053)
main.rs(565, 9): expected struct `construct::Bound`, found struct `construct::Point`

Возможен ли способ, которым я здесь пытаюсь? Как лучше всего это сделать?

1 Ответ

2 голосов
/ 01 мая 2020

Sub имеет параметр Rhs, который по умолчанию равен Self. impl Sub for Bound это сокращение от impl Sub<Bound> for Bound. Вы хотели бы добавить impl Sub<Point> for Bound.

impl Sub<Point> for Bound {
    type Output = Bound;
    fn sub(self, other: Point) -> Bound {
        Bound { min:self.min - other, max:self.max - other }
    }
}

Примечание: это не совсем работает, потому что текущий impl Sub for Point фактически потребляет other с первым -, оставляя "использование перемещенного значение "для второго -. Проще всего просто #[derive(Clone, Copy)] на Point.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...