Rust复用stdin输入Buffer时解决借用冲突:让Vec持有所有权类型
解决Rust中复用buffer时的借用冲突问题
你遇到的问题核心在于:Vec<&str>里的每个元素都是对buffer的不可变引用,只要info这个变量还处于作用域内,buffer就会一直被标记为不可变借用状态。虽然&str实现了Copy,但复制的只是引用本身——这些引用依然指向buffer的内存空间,所以buffer的借用关系并没有解除,自然无法执行clear()或再次可变借用的操作。
要让info持有元素的所有权,只需要把拆分出来的&str转换为拥有独立内存的String即可,这样info和buffer就不再有任何借用关联。修改方式很简单:
修改后的代码
use std::io; fn main() { let mut buffer = String::new(); io::stdin().read_line(&mut buffer).expect("failure reading stdin"); // 将&str转换为String,让info持有所有权 let mut info: Vec<String> = buffer.trim().split(" ").map(|s| s.to_string()).collect(); // 这里可以正常使用info println!("{:?}", info); // 现在可以安全地操作buffer了 buffer.clear(); io::stdin().read_line(&mut buffer).expect("failure reading stdin"); }
额外优化(可选)
如果你的需求是按任意空白字符拆分(比如多个空格、制表符等),可以用split_whitespace()替代split(" "),它会自动忽略连续的空白,避免生成空字符串:
let mut info: Vec<String> = buffer.trim().split_whitespace().collect();
这样修改后,info中的每个String都拥有自己的内存,和buffer彻底解耦,后续对buffer的修改(比如clear()、重新读取输入)就不会触发借用冲突了。
内容的提问来源于stack exchange,提问作者Pioneer_11
相关产品推荐
相关产品推荐

