< 返回版块

Anunaki 发表于 2020-05-06 19:32

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

评论区

写评论
作者 Anunaki 2020-05-06 22:16

我用的 CLion ,看到了 &&str 类型的提示,但是没太明白,以为 rust 会自动折叠多个 &&。

对以下内容的回复:

作者 Anunaki 2020-05-06 22:14

非常感谢!这样确实就可以了。同时我也在 stackoverflow 也发帖得到了回答,放到这里供后面入坑的人参考吧: https://stackoverflow.com/questions/61635885/cannot-borrow-hsets-as-mutable-because-it-is-also-borrowed-as-immutable/61636037#61636037

7sDream 2020-05-06 21:27
for &v in &hsets[0] {
    arr.push(v);
}

或者

for v in &hsets[0] {
    arr.push(*v);
}

因为 &HashSetIntoIterator实现里,Item 是引用(&T),所以这里的 v&&str 类型,你直接 pusharr 里的话,这个数组就持有了对整个 HashSet 的引用,进而引用了整个 hsets,这样你后面就不能再以 &mut 引用 hsets 了。

可以用 type_name 看下 v 的具体类型:

理论上你用 VSCode + Rust Analyzer 或者 Clion + Intellij Rust. 的话都是会有类型提示的,可以选一个用着。

1 共 3 条评论, 1 页