2016-06-21 9 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 |_| { 
      ^~~~~~ 

どのようにこの問題を解決するために?

変数を参照渡しすることはできません。クローズの有効期間が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" } 
+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

関連する問題