3

私は閉鎖を実験しています:

fn call_it(f: ||) {
    f(); 
}
let klosure = || println("closure!");
call_it(klosure);
call_it(klosure); //Blows up here

klosure を call_it() に 2 回渡すと、クロージャー値が移動するため、コンパイラ エラーが発生します。

closures.rs:16:13: 16:20 error: use of moved value: `klosure`
closures.rs:16     call_it(klosure);
                           ^~~~~~~
closures.rs:15:13: 15:20 note: `closure` moved here because it has type `||`, which is a non-copyable stack closure (capture it in a new closure, e.g. `|x| f(x)`, to override)
closures.rs:15     call_it(klosure);
                           ^~~~~~~

コンパイラは実際に問題を解決する方法を提案しますが、それをうまく適用する方法はわかりません。

助言がありますか?:D

4

2 に答える 2

2

注: `closure` は、コピー不可能なスタック クロージャであるタイプ `||` を持っているため、ここに移動しました (オーバーライドするには、新しいクロージャ、たとえば `|x| f(x)` でキャプチャします)。

|| closure()これは、代わりに:と書くことを意味しますclosure。最初のクロージャーを呼び出す新しいクロージャーを渡しています。

于 2014-02-25T05:53:17.747 に答える
0

(更新: これを行わないでください。近い将来に許可されなくなる可能性があります。A&mut ||はおそらく現在および将来的に問題なく動作します。この回答に関するコメントのディスカッションとリンクを参照してください。)

別の潜在的なアプローチ(読むのは少し醜いですが):

fn call_it(f_ref: &||) { // now takes a borrowed reference to a closure
    (*f_ref)();
}
let klosure = || println("closure!");
call_it(&klosure);
call_it(&klosure);
于 2014-02-26T11:15:11.813 に答える