use std::collections::HashSet;
fn main() {
let mut hsets = vec![];
hsets.push(HashSet::new());
hsets[0].insert("a1");
hsets[0].insert("a2");
hsets.push(HashSet::new());
hsets[1].insert("b1");
hsets[1].insert("b2");
// 临时变量,存放 [a1, a2]
let mut arr = vec![];
for v in &hsets[0] {
arr.push(v);
}
for v2 in arr {
hsets[1].insert(v2);
}
}
提示错误:
error[E0502]: cannot borrow `hsets` as mutable because it is also borrowed as immutable
--> src/main.rs:18:9
|
13 | for v in &hsets[0] {
| ----- immutable borrow occurs here
...
17 | for v2 in arr {
| --- immutable borrow later used here
18 | hsets[1].insert(v2);
| ^^^^^ mutable borrow occurs here
error: aborting due to previous error
1
共 3 条评论, 1 页
评论区
写评论我用的 CLion ,看到了 &&str 类型的提示,但是没太明白,以为 rust 会自动折叠多个 &&。
对以下内容的回复:
非常感谢!这样确实就可以了。同时我也在 stackoverflow 也发帖得到了回答,放到这里供后面入坑的人参考吧: https://stackoverflow.com/questions/61635885/cannot-borrow-hsets-as-mutable-because-it-is-also-borrowed-as-immutable/61636037#61636037
或者
因为
&HashSet
对IntoIterator
的实现里,Item 是引用(&T
),所以这里的v
是&&str
类型,你直接push
到arr
里的话,这个数组就持有了对整个HashSet
的引用,进而引用了整个hsets
,这样你后面就不能再以&mut
引用hsets
了。可以用
type_name
看下 v 的具体类型:理论上你用 VSCode + Rust Analyzer 或者 Clion + Intellij Rust. 的话都是会有类型提示的,可以选一个用着。