그것없이 움직이지 않고 폐쇄를 두 번 통과시킵니다
문제
클로저를 실험하고 있습니다 :
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
해결책
참고 :`closure`는 복사 할 수없는 스택 폐쇄 (새로운 폐쇄로 캡처하십시오) <||`유형이 있기 때문에 여기에서 옮겨졌습니다./ P>
이것은 || closure()
대신 closure
를 작성한다는 것을 의미합니다. 첫 번째 닫기를 호출하는 새 클로저를 전달하고 있습니다.
다른 팁
(업데이트 :이 작업을 수행하지 마십시오. 가까운 장래에는 허용되지 않을 수 있습니다. &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);
. 제휴하지 않습니다 StackOverflow