Обязательное заимствование одного структурного поля при заимствовании другого в закрытии

У меня есть структура, содержащая два поля, и я хочу изменить одно поле (изменяемое заимствование), используя другое поле (неизменяемое заимствование), но я получаю ошибку от средства проверки заимствования.

Например, следующий код:

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

Как Rust обновляет одно поле, используя другое из замыкания?

9
задан Shepmaster 21 April 2019 в 14:11
поделиться