2017-03-29 80 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」 –