Я учусь ржавчина, и я написал следующий код для чтения массива целых чисел от stdin
:Использования `let` связывания для увеличения срока службы значения
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);
}
}
Это работало отлично, однако, я чувствовал, let xs
линия была немного долго, поэтому я разделил его на две части:
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);
}
}
Это не работает! Rust ответил (а) с ошибкой:
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
Это меня смущает. Является ли line
или ss
тем, что не живем достаточно долго? И как я могу использовать привязку let для увеличения их продолжительности жизни? Я думал, что я уже использую let?
Я искал в Интернете решения и читал Lifetime guide, но я до сих пор не могу это понять. Может ли кто-нибудь дать мне подсказку?
Чтобы убедиться, что я правильно вас понимаю, 'CharSplits' ссылается на значение внутри' line'. Но на самом деле он ссылается на копию, взятую из 'Ok', которая отбрасывается, как только заканчивается строка' let ss'. Вместо того, чтобы сохранить все ценности до конца блока? –
Да. Временные значения действительны только для оператора, в котором находится выражение, которое производит это значение. –
Разве это не пустая трата памяти, чтобы не указывать внутри «линии»? –