1

Тема: Передача параметру self зі структури до замикання(closure)

Як передати параметр self всередину замикання?
Ось код, де я хочу зафіксувати зміну стану Checkbox в налаштуваннях:

        let show_history_default_state: bool =
            self.settings.boolean("is-search-history-shown");
        let show_search_history = gio::ActionEntry::builder("show_search_history")
            //Створення стану(state) необхідне для того, щоб з'явилася галочка Checkbox
            .state(show_history_default_state.to_variant())
            //Дія прив'язується до змінної action, відстежується за її допомогою
            //і перезаписується
            .activate( |_, action, _| {
                let state = action.state().unwrap();
                let action_state: bool = state.get().unwrap();
                let new_state = !action_state; // Натискання на Checkbox

                action.set_state(&new_state.to_variant());
                self.settings
                    .set_boolean("is-search-history-shown", new_state)
                   .expect("Could not set setting.");
                println!("Показати історію натиснуто")
                })
            .build();

Ось таку помилку видає:

error[E0521]: borrowed data escapes outside of method
  --> src/main_window.rs:60:35
   |
24 |       fn create_actions_entries(&self){
   |                                 -----
   |                                 |
   |                                 `self` is a reference that is only valid in the method body
   |                                 let's call the lifetime of this reference `'1`
...
60 |           let show_search_history = gio::ActionEntry::builder("show_search_history")
   |  ___________________________________^
61 | |             //Створення стану(state) необхідне для того, щоб з'явилася галочка Checkbox
62 | |             .state(show_history_default_state.to_variant())
63 | |             //Дія прив'язується до змінної action, відстежується за її допомогою
...  |
74 | |                 println!("Показати історію натиснуто")
75 | |                 })
   | |                  ^
   | |                  |
   | |__________________`self` escapes the method body here
   |                    argument requires that `'1` must outlive `'static`

Розумію, що треба щось на зразок weak pointer, але не знаю як зробити.

2

Re: Передача параметру self зі структури до замикання(closure)

Рішенням є клонування параметра self до нової змінної,
яку замикання автоматично захоплює зі свого оточення.
Код:

        //Дія для кнопки Show search history
        //Клонування параметра налаштування для передачі до замикання
        let new_settings = self.settings.clone();
        let show_history_default_state: bool =
            self.settings.boolean("is-search-history-shown");
        let show_search_history = gio::ActionEntry::builder("show_search_history")
            //Створення стану(state) необхідне для того, щоб з'явилася галочка Checkbox
            .state(show_history_default_state.to_variant())
            //Дія прив'язується до змінної action, відстежується за її допомогою
            //і перезаписується
            .activate(move |_, action, _| {
                let state = action.state().unwrap();
                let action_state: bool = state.get().unwrap();
                let new_state = !action_state; // Натискання на Checkbox

                action.set_state(&new_state.to_variant());

                new_settings
                    .set_boolean("is-search-history-shown", new_state)
                   .expect("Could not set setting.");
                println!("Показати історію натиснуто")
                })
            .build();