Компиляция следующего кода 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;
}
Приводит к ошибкам компилятора из-за владения 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;
^
Обоснование этого объясняется здесь и приводит к RFC, который не был принят (частично по причинам, приведенным в приведенном выше примере). Однако позже следующий RFC по-прежнему вводил сигнатуры по значению для операторов.
Пока я понимаю мотивы решения. Из-за отсутствия у меня опыта работы с ржавчиной я не уверен, каким «правильным» способом будет разрешить приведенный выше код работать (а), если я не хочу копировать, или (б) как сделать структуру копируемой?