2016-08-25 3 views
0

저는 녹의 차용 문제에 직면하고 있습니다. 해결할 생각이 있습니다. 그러나 나는 내가 찾은 길은 좋은 대답이 아니라고 생각한다. 그래서 그것을 해결할 다른 방법이 있는지 궁금합니다. 뭔가를 추가로 인수 input을 취하는 방법, f2을 가지고 S구조체의 멤버를 Rust에서 같은 구조체의 메서드에 전달

struct S { 
    val: u8 
} 

impl S { 
    pub fn f1(&mut self) { 
     println!("F1"); 
     self.f2(self.val); 
    } 

    pub fn f2(&mut self, input: u8) { 
     println!("F2"); 

     // Do something with input 
    } 
} 

fn main() { 
    let mut s = S { 
     val: 0 
    }; 

    s.f1(); 
} 

구조 :

나는 내 상황을 설명하기 위해 다음 예제 코드를 사용합니다. 또 다른 방법은 f1이며 f2val이고 구조는 S입니다. 외부인은 사용 사례에 따라 f1 또는 f2 중 하나를 호출 할 수 있습니다.

src\main.rs:9:17: 9:25 error: cannot use `self.val` because it was mutably borrowed [E0503] 
src\main.rs:9   self.f2(self.val); 
           ^~~~~~~~ 
src\main.rs:9:9: 9:13 note: borrow of `*self` occurs here 
src\main.rs:9   self.f2(self.val); 
         ^~~~ 

나는 대략 이해하는 방법을 녹에서 차입이 작품 : 나는 위의 코드를 컴파일

, 나는 다음과 같은 오류 메시지를 받았습니다. 그래서 나는 f1의 구현을 변경하여 문제를 해결할 수 있다는 사실을 알고 :

pub fn f1(&mut self) { 
    let v = self.val; 
    println!("F1"); 
    self.f2(v); 
} 

는 그러나, 나는 약간의 중복이 솔루션을 느낍니다. 추가 변수 바인딩을 사용하지 않고 이 문제를 해결할 수있는 방법이 있는지 궁금합니다.

답변

3

솔루션은 추가 변수 바인딩 때문에가 아니라 여분의 복사본으로 인해 작동합니다. 정수 유형을 암시 적으로 복사 할 수 있으므로 let v = self.val은 값의 복사본을 만듭니다. 그 복사본은 self에서 빌린 것이 아니라 소유하고 있습니다. 그래서 컴파일러는이 복사본으로 f2에 전화 할 수 있습니다.

self.f2(self.val)을 쓰면 컴파일러에서 self.val 복사본을 만들려고 시도합니다. 그러나이 위치에서는 self이 함수 호출을 위해 차용되었으므로 사본을 만들 수 없습니다. 따라서 이전에 값을 복사하지 않으면 호출 할 수 없습니다. 그리고 이것은 문법상의 제한 사항이 아니라 차용 증서의 집행입니다. 어쨌든 복사와 호출을 실제로 발생하는 순서대로 작성하는 것이 좋습니다.

인자로 사용하려고하는 유형이 (예 : String)이 아닌 경우 컴파일러에 명시 적으로 사본을 요청하려면 let v = self.val.clone(); self.f2(v);을 작성해야합니다. 복사하지 않고 전화를 거는 것은 허용되지 않습니다. 아마도 메소드를 변경 불가능하게 만들거나 인수를 어떻게 든 제거해야 할 것입니다.

+0

답장을 보내 주셔서 감사합니다. 나는'f2'에 전달하기 전에'self.val'을 더 잘 복사한다고 생각합니다. –

1

당신은 복사 가능한 값이 트릭을 사용할 수 있습니다

pub fn f1(&mut self) { 
    println!("F1"); 
    match self.val {x => self.f2(x)}; 
} 

그러나 명시 적으로 임시 변수를 사용하여 더 명확하고 관용적이다.

+0

답변 해 주셔서 감사합니다. 흥미로운 방법. –

관련 문제