通过一个关闭两次没有它移开

时间:2014-02-25 05:49:13

标签: rust rust-0.9

我正在尝试闭包:

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

2 个答案:

答案 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);