Ale w tym przypadku to i tak nie zadziała. Musisz tutaj użyć Cell lub innego wewnętrznie mutowalnego typu, bo IIRC akcja w podłączonym callbacku może się wywołać w dowolnym momencie. Więc referencja musi żyć dłużej. Jeśli to jest odpalane w osobnym wątku to możesz użyć RwLock na ten przykład (by równoległe odczyty mogły działać, a zapis blokował odczyt).
w jaki sposób mogę odczytać i zapisać dane do/z zmiennej w domknięciu?
Kod z którego korzystam raczej wymaga
move |_|
bo tak został stworzony GTK RSTen kod
let mut hashmap_buttons: HashMap<&str, bool> = Default::default();
for i in ["duplicate", "empty_folder"].iter() {
hashmap_buttons.insert(i, false);
}
buttons_search.connect_clicked(move |_| {
if *hashmap_buttons.get("duplicate").unwrap() {
buttons_select.show();
buttons_delete.show();
}
else{
buttons_select.hide();
buttons_delete.hide();
}
*hashmap_buttons.get_mut("duplicate").unwrap() = true;
}
Wywala błąd
cannot borrow `hashmap_buttons` as mutable, as it is a captured variable in a `Fn` closure
#rustlang #gtk #programowanie
Ale w tym przypadku to i tak nie zadziała. Musisz tutaj użyć
Cell
lub innego wewnętrznie mutowalnego typu, bo IIRC akcja w podłączonym callbacku może się wywołać w dowolnym momencie. Więc referencja musi żyć dłużej. Jeśli to jest odpalane w osobnym wątku to możesz użyćRwLock
na ten przykład (by równoległe odczyty mogły działać, a zapis blokował odczyt).fn connect_clicked(&self, f: F) -> SignalHandlerId {
unsafe extern "C" fn clicked_trampoline(
this: *mut
Rc
/Cell
lubArc
/RwLock
jest tym czego szukasz.