Тип должен соответствовать статическому времени жизни

Я пытаюсь увеличить структуру приложений Rust и GTK-RS, но не могу понять, как обращаться с событиями соединений. Я вижу, что проблема в неправильной жизни, но я не очень понимаю, как это можно исправить.

#[derive(Debug)]
struct CreatingProfileUI {
    window: gtk::MessageDialog,
    profile_name_entry: gtk::Entry,
    add_btn: gtk::Button,
    cancel_btn: gtk::Button,
}

#[derive(Debug)]
struct UI {
    window: gtk::Window,

    // Header
    url_entry: gtk::Entry,
    open_btn: gtk::Button,

    // Body
    add_profile_btn: gtk::Button,
    remove_profile_btn: gtk::Button,
    profiles_textview: gtk::TextView,

    // Creating profile
    creating_profile: CreatingProfileUI,

    // Statusbar
    statusbar: gtk::Statusbar,
}

impl UI {
    fn init(&self) {
        self.add_profile_btn
            .connect_clicked(move |_| { &self.creating_profile.window.run(); });
    }
}

И я получаю эту ошибку:

error[E0477]: the type `[closure@src/main.rs:109:46: 111:6 self:&UI]` does not fulfill the required lifetime
   --> src/main.rs:109:30
    |
109 |         self.add_profile_btn.connect_clicked(move |_| {
    |                              ^^^^^^^^^^^^^^^
    |
    = note: type must satisfy the static lifetime

1 ответ

Решение

Вы не можете перемещать нестатические ссылки в обратные вызовы GTK. Вам нужно что-то статичное или что-то выделенное кучей (например, в Box/RefCell/Rc/так далее.).

Обратные вызовы вызываются не из области, в которой вы подключаетесь к сигналу, а в более поздний момент из основного цикла. Требуется, чтобы все, что вы передаете в замыкание, было еще живо, что было бы чем угодно. 'static, выделенный в куче или выделенный в стеке между основным и местом выполнения основного цикла. Последняя часть в настоящее время не может быть хорошо выражена с помощью Rust/GTK-rs.

Смотрите пример внизу в документации по gtk-rs. Он использует Rc<RefCell<_>>,

Другие вопросы по тегам