首页 > 解决方案 > 为什么我不能从标准输入读取行、删除空格并将它们推入向量中?`line` 寿命不够长

问题描述

我想从标准输入读取行,删除空格并将它们推入向量中,但我不能,因为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

标签: rust

解决方案


如果您查看str::trim()(添加了生命周期注释)的定义:

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

您可以看到它返回一个引用原始字符串的一部分的字符串切片。也就是说,它借用字符串而不是复制它。这是有道理的,因为结果trim始终是原始结果的子字符串。

str::to_uppercase()您可能会对其他返回 new的函数(例如 , )感到困惑String。显然这是因为他们没有返回原始字符串的子字符串,所以他们必须创建一个新的。

TL;博士; 你有一个借来的&str,但你想拥有String一个存储在你的Vec. 只需添加.to_string().

关于缺点,它将分配一个新的String. 您可以尝试通过执行trimin place来避免它,但我认为这不值得,除非您配置文件并且您认为您的修剪会损害您的表现。


推荐阅读