2017-09-24 5 views
1

루프 내에서 변경 가능한 빌림을 얻으려고합니다. 작동시키지 못합니다. 가능한 모든 경비원, 생생한 포인터, 모든 것을 시도했습니다. 루프에서 빌릴 수 있습니다.

struct Test<'a> { 
    a: &'a str, 
} 

impl<'a> Test<'a> { 
    pub fn new() -> Self { 
     Test { a: &mut "test" } 
    } 

    pub fn dostuff(&'a mut self) { 
     self.a = "test"; 
    } 

    pub fn fixme(&'a mut self) { 
     let mut i = 0; 
     while i < 10 { 
      self.dostuff(); 
      i += 1; 
     } 
    } 
} 

fn main() { 
    let mut test = Test::new(); 
    test.fixme(); 
} 
나는이 문제를 해결하는 방법을 파악하는 것을 관리 할 수 ​​없습니다
error[E0499]: cannot borrow `*self` as mutable more than once at a time 
    --> src/main.rs:19:13 
    | 
19 |    self.dostuff(); 
    |    ^^^^ mutable borrow starts here in previous iteration of loop 
... 
22 |  } 
    |  - mutable borrow ends here 

Rust Playground example code

. 함수 서명을 동일하게 유지하려면 수정이 필요합니다. 내 코드는 훨씬 복잡하지만이 스 니펫은 최소한으로 줄입니다.

여기에 the complete code of what I'm trying to solve입니다.

+0

* 기능을 동일하게 유지하려면 수정이 필요합니다. * 아무 것도 변경할 수 없으면 아무 것도 수정할 수 없습니다. – Shepmaster

+0

'String' 대신'& str'을 사용해야 할 이유가 있습니까? 'Test'가 문자열을 소유하고 있다면, 소유 한 타입을 사용하십시오. – Boiethios

+0

문제가있는 실제 코드를 추가했습니다. 그것을 git repo에 밀어 넣었습니다. 놀이터 요지는 오류 그 자체의 예일뿐입니다. – Chronium

답변

1

fn dostuff(&'a mut self)으로 작성하면 self에 대한 참조가 수명이 'a 이상이어야합니다. 그러나 Test 구조체의 정의에서 사용한 것과 같은 'a입니다. 즉, 의 발신자는 test의 전체 수명 동안 self을 대여해야합니다. dostuff()이 한 번 호출 된 후에는 self이 차용되어 test이 삭제 될 때까지 차용이 완료되지 않습니다. 정의에 따라 함수를 한 번만 호출 할 수 있으므로 루프에서 호출 할 수는 없습니다.

나는 여전히 기능을 유지하기 위해 수정이 필요하면 같은

그래서, 당신은 지금이 불가능한 요구 것을 이해한다 시그니처. 함수 서명을 그대로 사용하거나 루프에서 호출 할 수 있습니다. 둘 다 가질 수는 없습니다.

+0

이것은 OP의 요구 사항 중 하나와 직접적으로 관련됩니다. * 동일한 기능을 유지하십시오 *. – Shepmaster

+1

@Shepmaster OP의 요구 사항은 불가능합니다. 나는 그것을 명확하게하기 위해 나의 대답을 업데이트했다. –

+0

@PeterHall은 git repo를 확인합니다. 거기에 실제 문제가 있음을 알 수 있습니다. 해결책이 있다면, 듣고 싶습니다. – Chronium