Gtk 如何从回调闭包中使用按钮本身?

Gtk 如何从回调闭包中使用按钮本身?,gtk,rust,lifetime,Gtk,Rust,Lifetime,我已经从gtk rs示例中编写了这段小代码,但它无法编译,因为无法从闭包中使用按钮 extern crate gtk; use gtk::prelude::*; fn main() { if gtk::init().is_err() { println!("Failed to initialize GTK."); return; } let window = gtk::Window::new(gtk::WindowType::Tople

我已经从gtk rs示例中编写了这段小代码,但它无法编译,因为无法从闭包中使用按钮

extern crate gtk;

use gtk::prelude::*;

fn main() {
    if gtk::init().is_err() {
        println!("Failed to initialize GTK.");
        return;
    }
    let window = gtk::Window::new(gtk::WindowType::Toplevel);
    let button = gtk::Button::new_from_stock("Click me !");

    window.add(&button);

    window.connect_delete_event(|_, _| {
        gtk::main_quit();
        Inhibit(false)
    });

    button.connect_clicked(move |_| {
        button.hide(); // error
    });

    window.show_all();
    gtk::main();
}
编译器编写:

如何解决这个问题

我不能通过引用传递变量:编译器说,这是无效的,因为闭包的生存期可能超过main的生存期

注意:我使用这个
Cargo.toml
来编译:

[package]
name = "test"
version = "0.1.0"
authors = ["Me"]

[features]
default = ["gtk/v3_16"]

[dependencies]
gtk = { git = "https://github.com/gtk-rs/gtk.git" }
下划线的意思不是“与闭包外的名称相同”,它的意思是“使闭包参数未使用/不可用”。尝试命名参数:

button.connect_clicked(move |button| {
    button.hide();
});

您可能会对或感兴趣。最大关联性:我知道,将事件发布到队列,并在主循环中处理它们。我来自C++,我几乎不懂锈病机制。谢谢你的解释!
button.connect_clicked(move |button| {
    button.hide();
});