我有一个包含两个字段的 struct ,我想用另一个字段(不可变borrow )修改一个字段(可变borrow ),但borrow 判断器出错.

例如,以下代码:

struct Struct {
    field1: Vec<i32>,
    field2: Vec<i32>,
}

fn main() {
    let mut strct = Struct {
        field1: vec![1, 2, 3],
        field2: vec![2, 3, 4],
    };

    strct.field1.retain(|v| !strct.field2.contains(v));

    println!("{:?}", strct.field1);
}

给出以下错误:

error[E0502]: cannot borrow `strct.field1` as mutable because it is also borrowed as immutable
  --> src/main.rs:12:5
   |
12 |     strct.field1.retain(|v| !strct.field2.contains(v));
   |     ^^^^^^^^^^^^^------^---^^-----^^^^^^^^^^^^^^^^^^^^
   |     |            |      |    |
   |     |            |      |    first borrow occurs due to use of `strct` in closure
   |     |            |      immutable borrow occurs here
   |     |            immutable borrow later used by call
   |     mutable borrow occurs here

在一个闭包中使用另一个字段更新一个字段的方法是什么?

推荐答案

通常,借阅判断器可以区分 struct 的不同字段,但这在闭包(lambda)中不起作用.

相反,borrow 闭包外的第二个字段:

let field2 = &strct.field2;
strct.field1.retain(|v| !field2.contains(v));

Rust相关问答推荐

WebDriver等待三十四?(Rust Se)

修改切片/引用数组

在执行其他工作的同时,从共享裁判后面的VEC中删除重复项

编译项目期间使用Cargo生成时出现rustc错误

如何定义实现同名但返回类型不同的 struct 的函数

如何高效地将 struct 向量中的字段收集到单独的数组中

为什么`str`类型可以是任意大小(未知大小),而`string`类型的大小应该是已知的?

写入引用会更新基础值,但引用会打印意外的值

无法将 rust 蚀向量附加到另一个向量

对于rustc编译的RISC-V32IM二进制文件,llvm objdump没有输出

try 实现线程安全的缓存

从 rust 函数返回 &HashMap

sha256 摘要仅适用于 &*

为什么我的trait 对象类型不匹配?

为什么 Rust 字符串没有短字符串优化 (SSO)?

`tokio::pin` 如何改变变量的类型?

max(ctz(x), ctz(y)) 有更快的算法吗?

从嵌入式 Rust 中的某个时刻开始经过的时间

Rust Serde 为 Option:: 创建反序列化器

当 `T` 没有实现 `Debug` 时替代 `unwrap()`