Sto ancora facendo piccoli passi nell'apprendimento di Rust e sono rimasto sorpreso da quanto segue.Perché in questo esempio viene visualizzato il messaggio "Il valore preso in prestito non vive abbastanza a lungo"?
non riuscivo a capire il motivo per cui questo codice viene compilato:
use std::iter::AdditiveIterator;
fn main() {
let range = [1,2,3,4,5,6,7,8,9];
let sum = range.iter().map(|&x| x * x).filter(|&x| x % 2 == 0).sum();
println!("{}", sum);
}
Anche se questo non lo fa: (semplicemente spostando il .iter()
up)
use std::iter::AdditiveIterator;
fn main() {
let range = [1,2,3,4,5,6,7,8,9].iter();
let sum = range.map(|&x| x * x).filter(|&x| x % 2 == 0).sum();
println!("{}", sum);
}
che rende questo errore:
test.rs:5:17: 5:36 error: borrowed value does not live long enough
test.rs:5 let range = [1,2,3,4,5,6,7,8,9].iter();
^~~~~~~~~~~~~~~~~~~
Sono sicuro che ha qualcosa a che fare con gli ambiti di ruggine ecc., Ma non sono sicuro di capire come per jus Spostare la chiamata al metodo su una linea diversa fa la differenza.
Questo è corretto: 'iter()' contiene un riferimento alla sezione originale e in tale istruzione viene immediatamente eliminato poiché non è memorizzato da nessuna parte. Il compilatore quindi ti salva dal comportamento indefinito, ma quasi certamente cattivo, che è use-after-free. –
Vedere anche questo post del blog per molte discussioni sullo spazio di progettazione qui: http://www.smallcultfollowing.com/babysteps/blog/2014/01/09/rvalue-lifetimes-in-rust/ (migrazione da una risposta Avevo pubblicato) – pnkfelix