Gtk 如何从回调闭包中使用按钮本身?
我已经从gtk rs示例中编写了这段小代码,但它无法编译,因为无法从闭包中使用按钮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
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();
});