2017-09-24 3 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が削除されるまで借用は完了しません。定義上、その関数を1回しか呼び出せないので、ループ内で呼び出すことはできません。私は修正がまだ機能を維持するために必要

だから同じ

をシグネチャ、あなたは今、これが不可能な要件であることを理解すべきです。関数の署名をそのまま使用することも、ループ内で呼び出すこともできます。両方を持つことはできません。

+0

これは、OPの要件の1つに直接関係します。*同じ機能を維持する*。 – Shepmaster

+1

@Shepmaster OPの必要条件はありません。私はそれをより明確にするために私の答えを更新しました。 –

+0

@PeterHallはgit repoをチェックアウトします。そこに実際の問題があるのを見ることができます。解決策があれば、それを聞いてみたいと思います。 – Chronium

関連する問題