2017-09-24 4 views
1

J'essaie d'obtenir un emprunt mutable dans une boucle, et je ne peux pas le faire fonctionner. J'ai essayé tous les gardes possibles, les pointeurs bruts, tout.Mutable emprunter dans la boucle

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

Je ne parviens pas à comprendre comment résoudre ce problème. J'ai besoin de la correction pour conserver les mêmes signatures de fonction. Mon code est beaucoup plus complexe, mais cet extrait le réduit au strict minimum.

Voici the complete code of what I'm trying to solve.

+0

* J'ai besoin de la correction pour garder les mêmes fonctions * - si nous ne pouvons rien changer, nous ne pouvons rien réparer. – Shepmaster

+0

Avez-vous une bonne raison d'utiliser '& str' au lieu d'un' String'? Si 'Test' possède la chaîne, utilisez le type appartenant. – Boiethios

+0

J'ai ajouté le code réel avec lequel j'ai des problèmes. Poussé à un repo git. L'aire de jeu n'était qu'un exemple de l'erreur elle-même. – Chronium

Répondre

1

Lorsque vous écrivez fn dostuff(&'a mut self) vous imposez que la référence à self doit vivre au moins aussi longtemps que la durée de vie 'a. Mais c'est le même 'a que vous avez utilisé dans la définition de la struct Test. Cela signifie que les appelants de dostuff doivent prêter self pour toute la durée de vie de test. Après dostuff() a été appelé une fois, self est maintenant emprunté et l'emprunt ne se termine pas jusqu'à test est abandonnée. Par définition, vous ne pouvez appeler cette fonction qu'une seule fois, vous ne pouvez donc pas l'appeler en boucle.

J'ai besoin du correctif pour toujours garder la fonction signatures même

Donc, vous devez comprendre maintenant que cela est une exigence impossible. Vous pouvez avoir la signature de la fonction telle quelle ou l'appeler en boucle. Vous ne pouvez pas avoir les deux.

+0

Cela va directement à l'encontre de l'une des exigences de l'OP: * conserver les mêmes fonctions *. – Shepmaster

+1

L'exigence de @Shepmaster OP est impossible. J'ai mis à jour ma réponse pour le rendre plus clair. –

+0

@PeterHall consultez le repo git. Vous pouvez voir là le problème réel, si vous avez une solution pour cela, j'aimerais l'entendre. – Chronium