sto imparando Rust, e ho scritto il seguente codice per leggere una serie di numeri interi da stdin
:Utilizzando un `let` vincolante per aumentare il ciclo di vita del valore
use std::io;
fn main() {
for line in io::stdin().lines() {
let xs:Vec<int> = line.unwrap().as_slice().trim().split(' ')
.map(|s|from_str::<int>(s).unwrap()).collect();
println!("{}", xs);
}
}
Questo funzionava bene, però, ho sentito il let xs
linea era un po 'lunga, quindi ho diviso in due:
fn main() {
for line in io::stdin().lines() {
let ss = line.unwrap().as_slice().trim().split(' ');
let xs:Vec<int> = ss.map(|s|from_str::<int>(s).unwrap()).collect();
println!("{}", xs);
}
}
questo non ha funzionato! Ruggine ha risposto con il seguente errore:
hello.rs:4:12: 4:25 error: borrowed value does not live long enough
hello.rs:4 let ss = line.unwrap().as_slice().trim().split(' ');
^~~~~~~~~~~~~
hello.rs:3:34: 7:3 note: reference must be valid for the block at 3:33...
hello.rs:3 for line in io::stdin().lines() {
hello.rs:4 let ss = line.unwrap().as_slice().trim().split(' ');
hello.rs:5 let xs:Vec<int> = ss.map(|s|from_str::<int>(s).unwrap()).collect();
hello.rs:6 println!("{}", xs);
hello.rs:7 }
hello.rs:4:3: 4:54 note: ...but borrowed value is only valid for the statement at 4:2; consider using a `let` binding to increase its lifetime
hello.rs:4 let ss = line.unwrap().as_slice().trim().split(' ');
^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
error: aborting due to previous error
Questo mi confonde. È line
o ss
che non vive abbastanza a lungo? E come posso usare un legame let per aumentare la loro durata? Pensavo di usare già un let?
Ho cercato sul Web soluzioni e ho letto il numero Lifetime guide, ma non riesco ancora a capirlo. Qualcuno può darmi un suggerimento?
Giusto per essere sicuro di aver capito bene, 'CharSplits' fa riferimento al valore all'interno di' line'. Ma in realtà fa riferimento a una copia presa da "Ok", che viene buttata via non appena finisce la riga "Let's". Invece di mantenere tutti i valori vivi fino alla fine del blocco? –
Sì. I valori temporanei sono validi solo per l'istruzione in cui si trova l'espressione che produce quel valore. –
Non è uno spreco di memoria non puntare all'interno della 'linea'? –