可循环借入

Chr*_*ium 3 mutable rust borrow-checker

我试图在一个循环中获得一个可变的借用,我无法让它工作.我已经尝试了所有可能的守卫,原始指针,一切.

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();
}
Run Code Online (Sandbox Code Playgroud)
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
Run Code Online (Sandbox Code Playgroud)

Rust Playground示例代码

我无法想办法解决这个问题.我需要修复仍然保持功能签名相同.我的代码要复杂得多,但是这个代码片段将其简化为最低限度.

这是我想要解决的完整代码.

Pet*_*all 7

当你写作时,fn dostuff(&'a mut self)你强制要求引用self必须至少与生命周期一样长'a.但它与'a您在Test结构定义中使用的相同.这意味着呼叫者dostuff必须self在整个生命周期内放贷test.在dostuff()被叫一次之后,self现在借来了,借款没有完成,直到test被取消.根据定义,您只能调用该函数一次,因此无法在循环中调用它.

我需要修复仍然保持功能签名相同

所以,你现在应该明白这是一个不可能的要求.您可以按原样使用函数签名,也可以循环调用它.你不能两者兼得.

  • 我有类似的问题,但我没有像OP那样严格的函数签名要求:我的选择是什么? (2认同)