2017-09-24 59 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

你有充分的理由使用'&str'而不是'String'嗎?如果'Test'擁有該字符串,則使用擁有的類型。 – Boiethios

+0

我已經添加了我遇到的實際代碼。推到一個git回購。操場的要點只是錯誤本身的一個例子。 – Chronium

回答

1

當您編寫fn dostuff(&'a mut self)時,您強制要求對self的引用必須至少與壽命'a一樣長。但是,它與您在Test結構的定義中使用的'a一樣。這意味着dostuff的來電者必須在test的整個有效期內借出self。在dostuff()被調用一次之後,self現在被借用,並且直到test被刪除,借入才結束。按照定義,你只能調用一次這個函數,所以你不能在循環中調用它。

我需要修復仍保持函數簽名相同

所以,你現在應該明白,這是一個不可能的要求。您可以按原樣設置函數簽名,也可以在循環中調用它。你不能擁有兩個。

+0

這直接違背了OP的要求之一:*保持功能相同*。 – Shepmaster

+1

@Shepmaster OP的要求是不可能的。我已經更新了我的答案,使其更清楚。 –

+0

@PeterHall檢查git回購。你可以看到實際的問題,如果你有解決方案,我很樂意聽到它。 – Chronium

相關問題