kompilacji następujący kod rdzy, która używa operatora przeciążeniaOperator przeciążenie wynikami wartość użytkową przeniósł wartości
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;
}
Wyniki błędy kompilatora powodu posiadania 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;
^
Uzasadnieniem tego zostało wyjaśnione here i doprowadziło do RFC, które nie zostało zaakceptowane (częściowo ze względu na przyczyny powyższego przykładu). Jednak później następujące RFC nadal wprowadził sygnatury typu wartości bezwzględnej dla operatorów.
Chociaż rozumiem uzasadnienie decyzji. Z powodu braku doświadczenia w rdzy, nie jestem pewien, jaki byłby "właściwy" sposób, aby powyższy kod mógł działać (a) jeśli nie chcę kopiować lub (b) jak uczynić strukturę kopiowalną?
Problem polega na tym, że 'let pp = & p + & p + & p' nie działa. – SirVer
@SirVer tak, musisz napisać coś w stylu 'let pp = & (& p + & p) + & p'. Myślę, że praktyczną rzeczą byłoby stworzenie kilku implementacji, jak sugeruje Vladimir Matveev (lub po prostu czerpanie z "Copy" i koniec z nim). –