2017-03-29 39 views
1

Rust中有什么常见的模式来实现这样的事情?在Rust中多次借用

的错误是

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

欢迎来到Stack Overflow!这是一个*非常常见的问题*; [现在有** 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社区提供的免费在线文档。 [* Rust编程语言*](https://doc.rust-lang.org/stable/book/)解释了Rust许多决定的基本原理,并展示了示例。 [参考和借阅章节](https://doc.rust-lang.org/stable/book/references-and-borrowing.html#the-rules)涵盖了以下事实:您可能没有任何其他参考例如,同时你有一个可变参考。 – Shepmaster

回答

2

直观上,Game s应该可能拥有它们的Sprite s。这是一个反映设计更改的更新版本。也在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

[已更新的代码](https://play.rust-lang.org/?gist=017bf2f07d346ee393107c9fe0e882e8&version=stable&backtrace=0)使用“Box” –

相关问题