2017-03-29 7 views
1

錆にこれを実装する共通のパターンはありますか?複数の借り入れの錆

エラーが

cannot borrow `sprite` as mutable because it is also borrowed as immutable 

である私は、問題を理解したがラストにこのような何かを実装する方法は考えています。

struct Sprite { 
    position: i32, 
} 

impl Sprite { 
    pub fn left(&mut self) { 
     self.position += 1; 
    } 
} 

struct Game<'g> { 
    sprite: &'g Sprite, 
} 

impl<'g> Game<'g> { 
    pub fn new(sprite: &Sprite) -> Game { 
     Game { sprite: sprite } 
    } 
} 

fn main() { 
    let mut sprite = Sprite { position: 3 }; 

    let game = Game::new(&sprite); 

    sprite.left(); 
} 

コードはplaygroundでも利用できます。

+1

ようこそスタックオーバーフロー!これは非常に一般的な質問*です。 [同じエラーメッセージで** 94の質問があります**](http://stackoverflow.com/search?q=%5Brust%5D+cannot+borrow+as+mutable+because+it+is+also+借用+ as +不変+は%3Aqです)。あなたは[尋ねる前にあなたの質問に多大な努力を払っています](https://meta.stackoverflow.com/q/261592/155423)を期待していますので、それらの既存の質問を読んでから説明してくださいどのように*この*質問はそれらとは異なります。人々が既存の回答を読まない場合、SOのようなサイトを持つ理由はあまりありません。 – Shepmaster

+0

また、身体の問題をより多くの散文で説明することを強くお勧めします。これは自然にもより貴重な*タイトル*に変換されます。 「これと似たようなもの」と言うと、ソリューションが役に立つかどうかを理解できるようになる前に、将来の回答検索者にコードの読み取り、解析、理解を促します。それは潜在的な回答者すべてに同じ努力を強いるので、回答者を遅くするか、そうでなければ落胆させる。 – Shepmaster

+1

に追加すると、Rustコミュニティが提供する無料のオンラインドキュメントを読むのは非常に良いアイデアです。 [* The Rust Programming Language *](https://doc.rust-lang.org/stable/book/)では、多くのRustの決定の理論的根拠とショーケースの例について説明しています。 [参照と借用に関する章](https://doc.rust-lang.org/stable/book/references-and-borrowing.html#the-rules)は、あなたが他の例えば、あなたが変更可能な参照を持っているときと同じです。 – Shepmaster

答えて

2

直感的には、GameはおそらくSpriteを所有しているはずです。そのデザイン変更を反映した最新バージョンがあります。また、playgroundにもあります。

struct Sprite { 
    position: i32, 
} 

impl Sprite { 
    pub fn left(&mut self) { 
     self.position += 1; 
    } 
} 

struct Game { 
    sprite: Sprite, 
} 

impl Game { 
    pub fn new(sprite: Sprite) -> Game { 
     Game { 
      sprite: sprite 
     } 
    } 
} 


fn main() { 
    let sprite = Sprite{ position: 3 }; 

    let mut game = Game::new(sprite); 

    game.sprite.left(); 
} 
+0

Spriteがこの巨大な構造になってしまい、あなたがコピーしたくない場合は、それらを 'Box'に入れることができます。 –

+0

「Box」を使用して[更新コード](https://play.rust-lang.org/?gist=017bf2f07d346ee393107c9fe0e882e8&version=stable&backtrace=0) –

関連する問題