Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Cannot pass self as callback parameter due to double borrowing

Tags:

rust

I'm trying to call closure that was saved inside a struct but I'd also like to pass the struct as an argument to the closure. Here's the specific piece of code.

pub fn react(&mut self) -> &mut Button {
   if let Some(ref mut c) = self.click_callback {
            c(self);
    }
    self
}

Note that self is a Button and self.click_callback is an Option<Box<Fn(&mut Button)>>

So from what I understand the "if let" borrows self until its scopes ends, but then when I try to pass self as an argument it attempts to borrow it again. Is there anything specific I can do that will avoid this double borrow attempt?

like image 361
Stents Avatar asked Aug 17 '15 06:08

Stents


1 Answers

The simplest solution is to break the callback out from self, like so:

let callback = self.click_callback.take();
if let Some(ref mut c) = callback {
    c(self);
}
self.click_callback = callback;
self

This temporarily replaces click_callback with None, hence why you have to put it back when you're done.

like image 144
DK. Avatar answered Sep 19 '22 20:09

DK.