Methods that promise not to touch some fields?

Was there a proposal for this at some point? For example, in this code below, I check for an optional, and then want to call another mutating method. To do this in current Rust, I believe I’ll need to clone the thing.

Sometimes I see advice to group fields into sub-structs. But the problem with that is that different methods need different combinations of fields, so there is not one “correct” way to partition the fields of your struct.

impl A {
    fn method1(&mut self) {
        if let Some(thing) = &self.optional_thing {
            self.method2(thing); // Not allowed...
        }
    }
    fn method2(&mut self, thing: &Thing) 
        where [I promised not to touch self.optional_thing]
    { 
        ... 
    }   
}

this has been talked about a lot (it is referred as partial borrowing), but nothing has gone past the idea stage atm.
so you should not expect anything stable in the next couple years.

a small note, the way partial borrows are usually describe though is by expliciting what they do use rather than what they don't.

to solve your problem, you may want to use inlining or free standning functions which take references to all the fields they need.

1 Like

I’m guessing you mean manual inlining - pasting the code of method2 in method1. Or can I mark a function as inline, and the borrow checker will treat it differently?

no, sadly i do mean manual. you could make it a macro ? macros do get exapanded before borrow checking.