12

I'm having a hard time with the borrow checker.

for item in self.xxx.iter() { self.modify_self_but_not_xxx(item); } 

The above code worked before I refactored some code into modify_self_but_not_xxx():

error: cannot borrow `*self` as mutable because `self.xxx` is also borrowed as immutable 

How can I call a mutating method while holding a reference to self (e.g. from within a for-loop)?

1 Answer 1

13

How can I call a mutating method while holding a reference to self (e.g. from within a for-loop)?

You can't, that's exactly what the borrowing rules prevent.

The main idea is that in your code, the borrow checker cannot possibly know that self.modify_self_but_not_xxx(..) will not modify xxx.

However, you can mutate self.yyy or any other parameters, so either you can:

  • do the computations of modify_self_but_not_xxx(..) directly in your loop body
  • define a helper function taking mutable references to update them:

    fn do_computations(item: Foo, a: &mut Bar, b: &mut Baz) { /* ... */ } /* ... */ for item in self.xxx.iter() { do_computations(item, &mut self.bar, &mut self.baz); } 
  • define a helper struct that has helper methods
Sign up to request clarification or add additional context in comments.

2 Comments

Thanks, I understand now. Lesson learned: when designing functions avoid references to self if possible -- don't borrow more than what is minimally necessary.
There is distinction between method and function in Rust. The Book ch. In short method has reference to Self, while function is simply associated with a struct.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.