2014-11-15 6 views
1

녹을 학습 중이며 클로저를 실험하기위한 간단한 코드를 구현했습니다. 그러나 해결 방법을 모르는 차용 검사기와 관련하여 문제가 발생했습니다.클로저에 람다 함수에 대한 고유 한 액세스가 필요합니다.

fn twice(x:int, f:|int| -> int) -> int { 
    f(f(x)) 
} 

는 내가 가이드를 통해 작업 및 차용 검사기가 좋아하지 않는 이유의 적당한 이해가있어

closure requires unique access to `f` but it is already borrowed 

다음과 같은 오류를 얻을 다음 함수를 컴파일 할 때 이 문제는 해결할 방법이 확실하지 않습니다.

임시 변수에 첫 번째 호출의 결과를 먼저 할당 한 다음 f(..)을 다시 호출하여 해결할 수 있습니다. 그러나 이것은 기분이 좋지 않습니다.

을 작성하는 데 더 깔끔하고 나은 방법이 있습니까? 아니면이 방법이 컴파일러에게 안전하다고 확신시킬 수 있습니까?

답변

3

전체 오류 메시지는 다음

이다
<anon>:2:7: 2:8 error: closure requires unique access to `f` but it is already borrowed 
<anon>:2  f(f(x)) 
      ^
<anon>:2:5: 2:6 note: previous borrow of `f` occurs here; the unique capture prevents subsequent moves or borrows of `f` until the borrow ends 
<anon>:2  f(f(x)) 
      ^
<anon>:2:12: 2:12 note: previous borrow ends here 
<anon>:2  f(f(x)) 
       ^

가 외부 호가, 어떤 의미, f를 예약하고에서이를 방지하는 제 사용되고있다. 이것은 클로우즈 대신에 메소드와 관련이있는 issue #6268과 매우 비슷합니다.

당신이 말했듯이, 임시 사용은 수정 프로그램이며 가장 합리적인 수정 프로그램입니다.

fn twice(x:int, f:|int| -> int) -> int { 
    let y = f(x); 
    f(y) 
} 
+0

감사합니다. 이것이 의도적으로 언어의 일부인지, 아니면 빌리 확인 프로그램의 어떤 경우에 우리가 정리할 가장자리 케이스인지 알고 있습니까? –

+0

반드시 수정해야합니다. –

+2

@JamesDavies, 주로 엣지 경우 (예 : 내가 언급 한 문제 참조) – huon