2016-06-21 19 views
0

Ich habe diesen kleinen Code aus gtk-rs Beispielen geschrieben, aber es kann nicht kompiliert werden, da die Schaltfläche nicht von der Schließung verwendet werden kann.Wie benutze ich die Schaltfläche selbst aus der Rückruffunktion?

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(); 
} 

Der Compiler schreibt:

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 |_| { 
      ^~~~~~ 

Wie dieses Problem zu lösen?

Ich kann Variablen nicht durch Verweis übergeben: es ist ungültig, weil die Lebensdauer der Schließung die Lebensdauer von Main überschreiten kann, sagt Compiler.

Hinweis: Ich benutze diese Cargo.toml zu kompilieren:

[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

Sie werden wahrscheinlich in http://stackoverflow.com/q/29540167/155423 oder http://stackoverflow.com/q/32044301/155423 interessiert. Von maximaler Relevanz: * Poste Ereignisse in eine Queue und handle sie in der Hauptschleife wie du willst * – Shepmaster

Antwort

2

Strich bedeutet nicht „denselben Namen wie außerhalb der Schließung“, bedeutet es „die Schließung Argument nicht genutzt/unbrauchbar machen“. Versuchen Sie, das Argument zu benennen:

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

Ok, das verstehe ich. Ich komme aus C++, und ich verstehe kaum Rostmechanismen. Danke für die Erklärung! – Boiethios