Rust同一Vector内字符串扩展遇借用检查错误,需克隆吗?
Rust可变/不可变借用冲突问题
先看你给出的代码:
let mut a = vec![String::from("aa"), String::from("bb")]; a[0] += &*a[1];
这段代码触发借用检查器报错,原因是a[0]属于可变借用(要修改它的内容),同时a[1]属于不可变借用,而Rust的核心借用规则不允许同一作用域内同时存在针对同一数据的可变与不可变借用。
编译器提示的含义
编译器的提示是让你把a[1]的内容先存到一个独立的本地变量中,再用这个变量去更新a[0]——这样就能打破"同时借用同一个Vec的两个元素"的冲突场景。
按照提示修改的示例代码:
let mut a = vec![String::from("aa"), String::from("bb")]; // 先把a[1]的内容克隆到本地变量 let b = a[1].clone(); a[0] += &b;
是否必须克隆?有没有更优方案?
分两种场景:
- 不需要保留
a[1]的内容:可以用std::mem::take直接转移a[1]的所有权,完全避免克隆操作,只做一次内容追加:
let mut a = vec![String::from("aa"), String::from("bb")]; // 取出a[1]的内容,原位置留下空字符串 let b = std::mem::take(&mut a[1]); a[0] += &b; // 或者如果不需要a[1]这个元素了,直接移除它 // let b = a.remove(1); // a[0] += &b;
这种方式只是把a[1]的字符串所有权转移到本地变量b,追加到a[0]时仅做一次内容拷贝,没有额外的克隆开销。
- 必须保留
a[1]的内容:此时克隆是不可避免的——因为你需要同时持有a[1]的完整内容,还要修改a[0],这时候按照编译器提示的方式,先克隆到本地变量再操作,是符合借用规则的合理做法。
内容的提问来源于stack exchange,提问作者nexus.chebykin
相关产品推荐
相关产品推荐

