【问题标题】:Type must satisfy the static lifetime类型必须满足静态生命周期
【发布时间】:2018-02-12 19:59:17
【问题描述】:

我正在尝试增加 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

【问题讨论】:

标签: rust gtk gtk-rs


【解决方案1】:

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

回调不是从您连接到信号的范围调用,而是在稍后从主循环调用。要求您传递给闭包的任何内容都仍然存在,这将是任何'static、堆分配或分配在主循环和主循环运行位置之间的堆栈上。最后一部分目前无法用 Rust/GTK-rs 很好地表达。

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

【讨论】:

猜你喜欢
  • 1970-01-01
  • 2015-05-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-01-03
  • 1970-01-01
  • 1970-01-01
  • 2011-09-12
相关资源
最近更新 更多