Compiling следующего Rust код, который использует оператор перегружатьОператор перегрузки по результатам стоимости при использовании перемещаемого значения
use std::ops::{Add};
#[derive(Show)]
struct Point {
x: int,
y: int
}
impl Add for Point {
type Output = Point;
fn add(self, other: Point) -> Point {
Point {x: self.x + other.x, y: self.y + other.y}
}
}
fn main() {
let p: Point = Point {x: 1, y: 0};
let pp = p + p;
}
приводит к ошибкам компилятора из-за владения р:
<anon>:21:18: 21:19 error: use of moved value: `p`
<anon>:21 let pp = p + p;
^
<anon>:21:14: 21:15 note: `p` moved here because it has type `Point`, which is non-copyable
<anon>:21 let pp = p + p;
^
Обоснование него объясняется here и привел к RFC, который не был принят (часть из-за причин приведенного выше примера). Однако позже следующие RFC по-прежнему вводили сигнатуры типа байтов для операторов.
Хотя я понимаю обоснование решения. Из-за моего отсутствия опыта в ржавчине, я не уверен, что «правильный» способ мог бы позволить вышеуказанному коду работать (а), если я не хочу копировать, или (б) как сделать структуру с возможностью копирования?
Проблема в том, что 'let pp = & p + & p + & p' не работает. – SirVer
@SirVer да, вам нужно написать что-то вроде 'let pp = & (& p + & p) + & p'. Я предполагаю, что практическая задача - создать несколько реализаций, как предлагает Владимир Матвеев (или просто вывести «Копировать» и сделать с ним). –