Compilare il seguente codice di ruggine che utilizza l'overloading degli operatorioverloading degli operatori per i risultati di valore d'uso di valore spostato
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;
}
Risultati in errori di compilazione dovuti alla proprietà di 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;
^
La logica dietro di esso è spiegato here e ha portato a uno RFC che non è stato accettato (parte del motivo dell'esempio sopra riportato). Tuttavia, in seguito il seguente RFC ha ancora introdotto le firme del tipo di valore per gli operatori.
Mentre capisco la logica alla base della decisione. A causa della mia mancanza di esperienza nella ruggine, non sono sicuro di quale sia il modo "corretto" per consentire il funzionamento del suddetto codice (a) se non voglio copiare o (b) come rendere la struttura copiabile?
Il problema con questo è che "let pp = & p + & p + & p' non funziona. – SirVer
@SirVer si, dovresti scrivere qualcosa come 'let pp = & (& p + & p) + & p'. Immagino che la cosa pratica da fare sarebbe creare diverse implementazioni, come suggerisce la risposta di Vladimir Matveev (o semplicemente derivare "Copia" e farla finita). –