将迭代器收集到向量中时克隆值

问题描述 投票:0回答:1

我正在编写一个程序,需要从

stdin
输入几行。我将该行读入一个字符串,然后将其拆分并将单词收集到一个向量中。这个字符串 (
buffer
) 在后面的行中重复使用,这样我就不需要为每一行输入创建一个新的字符串。

但是,当我尝试编译我的代码时,我发现我无法重用该字符串,因为它仍然是借用的。

let mut buffer = String::new();
io::stdin().read_line(&mut buffer).expect("failure reading stdin");
let mut info: Vec<&str> = buffer.trim().split(" ").collect(); // <-- immutable borrow of buffer
...
buffer.clear();  // <-- cannot borrow `buffer` as mutable because it is also borrowed as immutable
io::stdin().read_line(&mut buffer).expect("failure reading stdin");

我不完全确定这里发生了什么,因为我认为

info
会根据
buffer
中的数据创建 &str(因为 &str 实现复制)。但无论哪种方式,我都需要更改我的程序以删除此借用。最简单的方法似乎是修改有问题的行,以便
info
拥有它包含的
&str
。我该怎么做?

谢谢,

rust iterator ownership
1个回答
0
投票

如果您希望

info
Vec<String>
而不是
Vec<&str>

这有效(测试 Rust 1.66.1)
fn main() {
    let mut buffer = String::from("I am an example of a string!");
    let info: Vec<_> = buffer.trim().split(' ').map(|x| x.to_string()).collect();

    buffer.clear();

    println!("Buffer cleared. Info content: {:?}", info);
}

编辑:

记住

str
实现
Copy
https://doc.rust-lang.org/std/primitive.str.html

据我了解,它是实现Copyreference

,所以你实际上并没有得到内容的副本,只是内存地址。

© www.soinside.com 2019 - 2024. All rights reserved.