类型必须满足静态生命周期

时间:2017-09-04 14:42:58

标签: rust gtk gtk-rs

我试图增加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 个答案:

答案 0 :(得分:5)

您无法将非静态引用移动到GTK回调中。您需要静态或分配堆的东西(例如,在Box / RefCell / Rc /等。)。

不会从连接到信号的示波器调用回调,而是在主循环的某个稍后点调用回调。无论你传递到闭包中的是什么,然后都是活着的,这将是任何'static,在主要循环和主循环之间的堆栈上堆分配或分配。目前使用Rust / GTK-rs无法很好地表达最后一部分。

the example at the bottom in the gtk-rs docs for an example。它使用Rc<RefCell<_>>