2016-06-21 33 views
0

我已經從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(); 
} 

編譯器寫道:

src/main.rs:22:3: 22:9 error: cannot move `button` into closure because it is borrowed [E0504] 
src/main.rs:22  button.hide(); 
        ^~~~~~ 
src/main.rs:21:2: 21:8 note: borrow of `button` occurs here 
src/main.rs:21 button.connect_clicked(move |_| { 
      ^~~~~~ 

如何解決這個問題呢?

我無法通過引用傳遞變量:它是無效的,因爲閉包的生命週期可能會超過主生命週期,編譯器說。

注:我用這個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" } 
+0

您可能會對http://stackoverflow.com/q/29540167/155423或http://stackoverflow.com/q/32044301/155423感興趣。最大的相關性:*將事件發佈到隊列中,並根據需要在主循環中處理它們* – Shepmaster

回答

2

下劃線並不意味着「同名的封閉外」,意思是「使關閉未使用的參數/不可用」。嘗試命名參數:

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

好吧,我明白知道。我來自C++,而且我幾乎不瞭解防鏽機制。謝謝你的解釋! – Boiethios