stdin에서 줄을 읽고 공백을 제거하고 벡터로 밀어 넣을 수없는 이유는 무엇입니까? `line`이 충분히 오래 살지 않음 [중복]

Aug 17 2020

stdin에서 줄을 읽고 공백을 제거하고 벡터로 밀어 넣고 싶지만 line충분히 오래 살지 않기 때문에 할 수 없습니다 . 왜?

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

답변

2 rodrigo Aug 17 2020 at 15:39

str::trim()(추가 된 평생 주석) 의 정의를 보면 :

pub fn trim<'a>(&'a self) -> &'a str

원래 문자열의 일부를 참조하는 문자열 조각을 반환하는 것을 볼 수 있습니다. 즉, 문자열을 복사하는 대신 차용합니다. 의 결과 trim는 항상 원래의 하위 문자열 이기 때문에 의미가 있습니다 .

str::to_uppercase()new를 반환하는 ,와 같은 다른 함수로 인해 혼동 될 수 있습니다 String. 분명히 이것은 원래 문자열의 하위 문자열을 반환하지 않으므로 새 문자열을 만들어야하기 때문입니다.

TL; DR; 당신은 빌 &str렸지만 당신 StringVec. 그냥 추가 .to_string().

단점에 관해서는 새로운 String. trimin place 를 수행하여 피할 수는 있지만 프로필을 작성하고 트리밍으로 인해 성능이 저하된다고 결정하지 않는 한 그럴 가치가 없다고 생각합니다.