Do you find anything "bad" about this code solving the problem?
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();
}
Prints: [Button: "Click me"]
[Button: "Clicked!"]