Ho visto questo codice nella documentazione di Rust:Che cosa significa la e commerciale in un tipo di Ruggine?
fn eat(&self) {
println!("{} is done eating.", self.name);
}
che cosa fa il &
in &self
significa?
Ho visto questo codice nella documentazione di Rust:Che cosa significa la e commerciale in un tipo di Ruggine?
fn eat(&self) {
println!("{} is done eating.", self.name);
}
che cosa fa il &
in &self
significa?
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
.
La risposta è nello book: proprietà/prestito è una delle caratteristiche principali della ruggine.
Prova a leggere il libro, vale davvero il tempo che ci dedichi.
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
@ 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 –