我正在尝试闭包:
fn call_it(f: ||) {
f();
}
let klosure = || println("closure!");
call_it(klosure);
call_it(klosure); //Blows up here
将klosure传递给call_it()两次导致编译器错误,因为闭包值被移动:
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
答案 0 :(得分:2)
注意:`closure`在这里移动,因为它有类型`||`,这是一个不可复制的堆栈闭包(在新的闭包中捕获它,例如`| x | f(x)`,以覆盖)< / p>
这意味着您将编写|| closure()
而不是closure
:您正在传入一个新的闭包,它会调用您的第一个闭包。
答案 1 :(得分:0)
(更新:不要这样做,在不久的将来可能会被禁止。&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);