我正在编写一个程序,需要从
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
。我该怎么做?
谢谢,
如果您希望
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
据我了解,它是实现Copy
的reference