문제

클로저를 실험하고 있습니다 :

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);
.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top