2014-05-03 12 views
12

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.

risposta

10

Non so Rust molto, solo indovinando.

Sembra che la matrice venga distrutta alla fine dell'istruzione let range = [1,2,3,4,5,6,7,8,9].iter(); in quanto non esiste alcuna variabile che contenga quel vettore. E così hai un iteratore pendente che non punta da nessuna parte.

Lo stesso in C++, dove è possibile creare un iteratore su un oggetto che viene eliminato dopo.

+5

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. –

+1

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

Problemi correlati