stdin에서 줄을 읽고 공백을 제거하고 벡터로 밀어 넣을 수없는 이유는 무엇입니까? `line`이 충분히 오래 살지 않음 [중복]
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
str::trim()(추가 된 평생 주석) 의 정의를 보면 :
pub fn trim<'a>(&'a self) -> &'a str
원래 문자열의 일부를 참조하는 문자열 조각을 반환하는 것을 볼 수 있습니다. 즉, 문자열을 복사하는 대신 차용합니다. 의 결과 trim
는 항상 원래의 하위 문자열 이기 때문에 의미가 있습니다 .
str::to_uppercase()new를 반환하는 ,와 같은 다른 함수로 인해 혼동 될 수 있습니다 String
. 분명히 이것은 원래 문자열의 하위 문자열을 반환하지 않으므로 새 문자열을 만들어야하기 때문입니다.
TL; DR; 당신은 빌 &str
렸지만 당신 String
의 Vec
. 그냥 추가 .to_string()
.
단점에 관해서는 새로운 String
. trimin place 를 수행하여 피할 수는 있지만 프로필을 작성하고 트리밍으로 인해 성능이 저하된다고 결정하지 않는 한 그럴 가치가 없다고 생각합니다.