use std::rc::Rc; use std::cell::RefCell; struct Button { text: String, on_click: Option<Rc<dyn Fn()>>, } impl Button { fn new(text: &str) -> Self { Button { text: text.to_string(), on_click: None } } fn draw(&self) { println!("[Button: \"{}\"]", self.text); } fn fire_click(button: &Rc<RefCell<Button>>) { let cb = button.borrow().on_click.clone(); if let Some(cb) = cb { cb(); } } } fn main() { let button = Rc::new(RefCell::new(Button::new("Click me"))); let cb_handle = Rc::clone(&button); button.borrow_mut().on_click = Some(Rc::new(move || { cb_handle.borrow_mut().text = "Clicked!".to_string(); })); button.borrow().draw(); Button::fire_click(&button); button.borrow().draw(); }
[Button: "Click me"] [Button: "Clicked!"]