1

Тема: Як викликати self метод структури в замиканні(closure)

Потрібно викликати метод self в замиканні.
Ось код:

fn set_connect_signals(&self){
        let default_dict_paths = "default-dict-path".to_string();
        self.settings.connect_changed(
            Some(&default_dict_paths), move |_, _|{
                self.download_dict_paths();
            });
    }

Якби це була звичайна змінна структури, то її можна було б клонувати.
І я не можу винести цей метод за межі структури,
бо він прив'язаний до певного екземпляра структури.
Що в такому разі треба зробити?

2

Re: Як викликати self метод структури в замиканні(closure)

А чому не виходить клонувати self? У чому проблема? Це звичайне посилання на змінну структури.

Подякували: Teg Miles1

3

Re: Як викликати self метод структури в замиканні(closure)

koala написав:

А чому не виходить клонувати self? У чому проблема? Це звичайне посилання на змінну структури.

Дійсно клонується. У мене просто спочатку не виходило, видавало помилку пов'язану із self, певно,
я щось не так записав, коли пробував клонувати його вперше.
Але клонування метода автоматично запускає його при побудові складових інтерфейсу.
У моєму випадку шляхи до словників завантажуються двічі:
один раз, коли викликаю метод при побудові вікна, і ще раз, коли клоную цей метод.
Тому я прибрав клонування і просто продублював метод усередині замикання.
Можна було, звісно, лишити лише клонування, але тоді дуже важко буде відстежити що де запускається.
Ось так зробив:

 fn set_connect_signals(&self) {
        let default_dict_paths_name = "default-dict-path".to_string();
        let settings = self.settings.clone();
        let dict_paths_listbox = self.dict_paths_listbox.clone();
        //let download_dict_paths = self.download_dict_paths().clone();
        self.settings.connect_changed(
            Some(&default_dict_paths_name), move |_, _| {
                //download_dict_paths;
                dict_paths_listbox.remove_all();
                 let default_dict_paths: String =
                    settings.string("default-dict-path").to_string();
                if default_dict_paths != ""{
                    for path in default_dict_paths.lines(){
                        let new_path = gtk::Label::new(Some(path));
                        dict_paths_listbox.append(&new_path);
                    }
                }
            });
    }