我正在写一个程序,它从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
。我如何才能做到这一点?
谢谢你,
2条答案
按热度按时间mlnl4t2r1#
如果你想让
info
变成Vec<String>
而不是Vec<&str>
,这是可行的(Rust 1.66.1测试):编辑:
请记住,
str
* 不 * 实现Copy
:https://doc.rust-lang.org/std/primitive.str.html据我所知,是reference实现了
Copy
,所以实际上并没有得到内容的副本,只是得到了内存地址的副本。6ioyuze22#
&str
是对现有字符的引用。除非它们是静态的,否则字符必须有所有者,通常是String
类型。您的代码只有一个
String
,它可以拥有字符(buffer
)。例如,如果使用
let info: &str = buffer.as_str()
获取对String
的共享引用,则不能在该引用存在时修改String
。具体而言,不能在对String
的任何其他引用存在时获取对String
的可变引用。可变引用必须是对所拥有示例的唯一引用。split
方法返回&str
的迭代器,然后将其存储在Vec
中。这些&str
对象中的每一个都是对所拥有的String
的引用,并且只要包含它们的Vec
就存在。当它们存在时,您无法获得可变引用来修改buffer
。要允许修改,您需要将共享引用转换为新拥有的类型(
String
)以存储在Vec
中,如vellista的答案所示。