Neden stdin'den satırları okuyamıyorum, boşlukları kaldırıp bir vektörün içine itemiyorum? "line" yeterince uzun yaşamıyor [yineleme]
Stdin'den satırları okumak, boşlukları kaldırmak ve onları bir vektörün içine itmek istiyorum ama yapamıyorum çünkü line
yeterince uzun yaşamıyor. Neden?
use std::io::{self, BufRead};
fn main() {
let stdin = io::stdin();
let mut read = Vec::new();
for line in stdin.lock().lines() {
let line = line.unwrap();
let line = line.trim();
read.push(line);
}
}
error[E0597]: `line` does not live long enough
--> src/main.rs:8:20
|
8 | let line = line.trim();
| ^^^^ borrowed value does not live long enough
9 | read.push(line);
| ---- borrow later used here
10 | }
| - `line` dropped here while still borrowed
Yanıtlar
str::trim()(Ömür boyu ek açıklamalar eklendi) tanımına bakarsanız :
pub fn trim<'a>(&'a self) -> &'a str
Orijinal dizenin bir kısmına başvuran bir dize dilimi döndürdüğünü görebilirsiniz. Yani dizeyi kopyalamak yerine ödünç alır. Bu mantıklı, çünkü sonucu trim
her zaman orijinal olanın bir alt dizesidir.
str::to_uppercase()Yeni bir String
. Döndüren gibi diğer işlevler kafanızı karıştırabilir . Açıkçası bunun nedeni, orijinal dizenin bir alt dizesini döndürmemeleridir, bu nedenle yeni bir tane oluşturmak zorundadırlar.
TL; DR; Ödünç aldınız, &str
ancak sahip String
olduğunuz birinin Vec
. Sadece ekleyin .to_string()
.
Olumsuz yönleri hakkında, yeni bir tahsis edecek String
. trimYerinde bir şey yaparak bundan kaçınmayı deneyebilirsiniz , ancak profilinizi çizip kırpmanızın performansınızı düşürdüğüne karar vermedikçe buna değeceğini sanmıyorum.