Non si può prendere in prestito come immutabile perché è anche preso in prestito come mutabile negli argomenti della funzione

Cosa sta succedendo qui ( parco giochi )?

struct Number { num: i32 } impl Number { fn set(&mut self, new_num: i32) { self.num = new_num; } fn get(&self) -> i32 { self.num } } fn main() { let mut n = Number{ num: 0 }; n.set(n.get() + 1); } 

Fornisce questo errore:

 error[E0502]: cannot borrow `n` as immutable because it is also borrowed as mutable --> :17:11 | 17 | n.set(n.get() + 1); | - ^ - mutable borrow ends here | | | | | immutable borrow occurs here | mutable borrow occurs here 

Tuttavia se si cambia semplicemente il codice a questo funziona:

 fn main() { let mut n = Number{ num: 0 }; let tmp = n.get() + 1; n.set(tmp); } 

Per me quelli sembrano esattamente equivalenti – voglio dire, mi aspetterei che il primo si trasformi in quest’ultimo durante la compilazione. Rust non valuta tutti i parametri di funzione prima di valutare la chiamata della funzione di livello successivo?

Questa linea:

 n.set(n.get() + 1); 

è inugurato in

 Number::set(&mut n, n.get() + 1); 

Il messaggio di errore potrebbe essere un po ‘più chiaro ora:

 error[E0502]: cannot borrow `n` as immutable because it is also borrowed as mutable --> :18:25 | 18 | Number::set(&mut n, n.get() + 1); | - ^ - mutable borrow ends here | | | | | immutable borrow occurs here | mutable borrow occurs here 

Poiché Rust valuta gli argomenti da sinistra a destra, quel codice è equivalente a questo:

 let arg1 = &mut n; let arg2 = n.get() + 1; Number::set(arg1, arg2); 

Ora dovrebbe essere ovvio cosa c’è che non va. Scambiando queste prime due righe, risolve questo problema, ma Rust non esegue questo tipo di analisi del stream di controllo.

Questo è stato inizialmente creato come bug # 6268 , ora è integrato in RFC 811 .

A partire da 1.25.0-nightly 2018-01-13, è ansible utilizzare le durate non lessicali . Se esegui il tuo esempio su Rust notturno e attivi la funzionalità NLL utilizzando #![feature(nll)] , verrà ora compilato senza errori .