Wpis z mikrobloga

Hej,

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 RS

Ten 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
  • 4
@qarmin: stwórz tymczasową referencję - https://play.rust-lang.org/?version=stable&mode=debug&edition=2018&gist=8b6addf032fca00b891f4920a41b3559

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).
@Hauleth: Tylko z tego co widzę funkcja connectclicked nie implementuje FnOnce, tylko raczej samo Fn

fn connect_clicked(&self, f: F) -> SignalHandlerId {
unsafe extern "C" fn clicked_trampoline(
this: *mut gtk_sys::GtkButton,
f: glib_sys::gpointer,
) where
P: IsA,
{
let f: &F = &*(f as *const F);
f(&Button::from_glib_borrow(this).unsafe_cast_ref())
}

a potrzebowałbym skorzystać z tej zmiennej również w innych domknięciach

Dodatkowo wywala błąd po zmianie

borrowed value does not live long enough