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]

Aug 17 2020

Stdin'den satırları okumak, boşlukları kaldırmak ve onları bir vektörün içine itmek istiyorum ama yapamıyorum çünkü lineyeterince 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

2 rodrigo Aug 17 2020 at 15:39

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 trimher 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, &strancak sahip Stringolduğ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.