2016-06-21 4 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