2015-08-09 8 views

risposta

21

Ciò significa che si passerà un riferimento all'oggetto, invece di spostare l'oggetto stesso. E 'l'importazione di distinguere questo perché se la vostra funzione sembrava:

fn eat(self) { 
    println!("{} is done eating.", self.name); 
} 

e provato a chiamare lo poi utilizzando la variabile dopo, si otterrebbe un errore

object = Foo::new(); 
object.eat(); 
object.something(); // error, because you moved object in eat 

perché quando si don' t specificare &, la ruggine sposta il valore nella funzione e l'associazione originale non ha più proprietà. controlla questo esempio minimo che ho creato (playground version):

struct Foo { 
    x : u32 
} 

impl Foo { 

    fn eat(self) { 
     println!("eating"); 
    } 

    fn something(&self) { 
     println!("else"); 
    } 

} 

fn main() { 
    println!("Hello, world!"); 

    let g = Foo { x: 5 }; 
    g.eat(); 
    g.something(); // if this comes before eat, no errors because we arent moving 
} 

Ora passare something di essere chiamato primaeat. Perché something prende solo un riferimento, g ha ancora la proprietà e puoi continuare. eat invece sposta g e non è più possibile utilizzare g.

+0

Penso di aver capito. una cosa che non ho ottenuto è nel secondo esempio: la funzione qualcosa: whay hai passato & self come parametro. È qualcosa che devi fare per creare una funzione all'interno di mathoods (impl)? – user3522940

+0

@ user3522940 Ho passato '& self' perché volevo dire a ruggine ** non ** di spostare il valore. In questo modo la variabile mantiene la proprietà oltre la chiamata della funzione, prova a rimuovere '&' e otterrai lo stesso errore. È importante notare che una mossa non è una copia, è letteralmente una mossa –

2

La risposta è nello book: proprietà/prestito è una delle caratteristiche principali della ruggine.

Prova a leggere il libro, vale davvero il tempo che ci dedichi.

Problemi correlati