Questo codice non riesce come previsto al let c = a;
con errore di compilazione "uso di valore mosso: a
":Rilegatura variabile: spostare un & mut o prendere in prestito il referente?
fn main() {
let a: &mut i32 = &mut 0;
let b = a;
let c = a;
}
una viene spostato in B e non è più disponibile per un incarico a c. Fin qui tutto bene.
Tuttavia, se ho appena annotare tipo b
s' e lasciare tutto il resto da solo:
fn main() {
let a: &mut i32 = &mut 0;
let b: &mut i32 = a;
let c = a;
}
il codice non riesce di nuovo a let c = a;
ma questa volta con un messaggio di errore molto diverso: "non può muoversi fuori a
perché è preso in prestito ... prendere in prestito dei *a
verifica qui: let b: &mut i32 = a;
"
Quindi, se ho appena annotare tipo s' b
: n o spostare a
in b
, ma invece un "re" -borrow di *a
?
Cosa mi manca?
Cheers.
Thx Levans per la risposta. Ho effettivamente controllato la variante subscope in precedenza per verificare che un prestito di "* a" abbia effettivamente avuto luogo. Potrebbe essere stato solo un falso messaggio di compilatore, dopo tutto. Per quanto riguarda la tua ipotesi, mi sentirei molto a disagio se ogni volta che uso un'annotazione di tipo dovrei essere preparato per qualche strana riscrittura del significato ovvio: "let a = b;' dovrebbe sempre essere solo una mossa o una copia, tipo annotato o no. – dacker
@dacker bene, tieni presente che questo comportamento * può * essere raggiunto solo con i riferimenti '& mut', nel qual caso un ri-prestito è semplicemente una copia che rispetta le regole del prestito. – Levans
Ma non era un grande punto in tutti i documenti che ho letto fino ad ora: & muts sono sempre spostati in questi casi? NB: lo stesso comportamento di cui sopra si verifica con assegnazioni di tipo annotated & muts. – dacker