Mutably borrow one struct field while borrowing another in a closure

borrow-checker, closures, mutability, rust

Solution

Usually the borrow checker can distinguish between the different fields of a structure, but this doesn't work within closures (lambdas).

Instead, borrow the second field outside the closure:

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

Problem

I have a struct containing two fields and I want to modify one field (mutable borrow) using another field (immutable borrow), but I get an error from the borrow checker. For instance, the following code: ``` 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); } ``` gives the following error: ``` 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 ``` What are the Rust ways of updating one field using another from within a closure?

Original source