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

相关问题