rust - 为什么我不能从标准输入读取行、删除空格并将它们推入向量中?`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
解决方案
如果您查看str::trim()
(添加了生命周期注释)的定义:
pub fn trim<'a>(&'a self) -> &'a str
您可以看到它返回一个引用原始字符串的一部分的字符串切片。也就是说,它借用字符串而不是复制它。这是有道理的,因为结果trim
始终是原始结果的子字符串。
str::to_uppercase()
您可能会对其他返回 new的函数(例如 , )感到困惑String
。显然这是因为他们没有返回原始字符串的子字符串,所以他们必须创建一个新的。
TL;博士; 你有一个借来的&str
,但你想拥有String
一个存储在你的Vec
. 只需添加.to_string()
.
关于缺点,它将分配一个新的String
. 您可以尝试通过执行trim
in place来避免它,但我认为这不值得,除非您配置文件并且您认为您的修剪会损害您的表现。
推荐阅读
- json - 在powershell中转换json时,如何解决“无法绑定参数'uri'。无法转换......”?
- amazon-web-services - 如何使用 AWS Route 53 将子域重定向到特定页面?
- typescript - 带有 TypeScript 和 ES 模块的 Jest 无法从 commonjs 模块导入“命名导入”
- selenium - 在没有部署和外部服务的情况下,在持续集成管道中测试所有隔离的 Web 应用程序
- kml - KML 线串长度
- python - 有哪些方法可以直接通过 django admin 更改站点的横幅图像?
- javascript - 来自mysql数据库的PHP动态图表数据
- html - 为什么我的 html 图像 scr 搜索的是 url 而不是我的目录?
- visual-studio - unity Camera 垂直滚动效果
- java - SASL_SSL 安全协议如何工作?客户端是否验证服务器(X.509 证书)?