2017-03-29 3 views
1

Gibt es ein allgemeines Muster, um so etwas in Rust zu implementieren?Mehrfache Ausleihe in Rust

Der Fehler ist

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

ich das Problem verstehen, haben aber keine Ahnung, wie so etwas in Rust zu implementieren.

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(); 
} 

Der Code ist auch auf der playground verfügbar.

+1

Willkommen bei Stack Overflow! Dies ist eine * extrem häufige Frage *; [Es gibt jetzt ** 94 Fragen mit der gleichen Fehlermeldung **] (http://stackoverflow.com/search?q=%5Brust%5D+kann+++++++++++++++++++++++++++++++ geliehen + als + unveränderlich + ist% 3Aq). SO erwartet, dass Sie sich [eine Menge Mühe in Ihre Frage gemacht haben, bevor Sie fragen] (https://meta.stackoverflow.com/q/261592/155423), also sollten Sie sich die Zeit nehmen, diese vorhandenen Fragen durchzulesen und dann zu erklären wie * diese * Frage ist anders als diese. Wenn die Leute keine vorhandenen Antworten lesen, gibt es nicht viel Grund, eine Website wie SO zu haben. – Shepmaster

+0

Zusätzlich würde ich vorschlagen, mehr Prosa zu verwenden, um Ihr Problem im Körper zu beschreiben. Dies wird natürlich auch in einen besseren * Titel * übersetzt, der von unschätzbarem Wert ist. Wenn man "so etwas" sagt, zwingt ein zukünftiger Antwortsucher seinen Code zu lesen, zu analysieren und zu verstehen, bevor er verstehen kann, ob die Lösungen für sie nützlich sind. Es erzwingt die gleiche Anstrengung bei jedem potenziellen Beantworter, was mögliche Beantworter verlangsamt oder anderweitig entmutigt. – Shepmaster

+1

Hinzufügen, es ist eine * sehr gute Idee *, die kostenlose Online-Dokumentation der Rust-Community zu lesen. [* The Rust Programming Language *] (https://doc.rust-lang.org/stable/book/) erklärt die Gründe für viele Entscheidungen von Rust und zeigt Beispiele. Das [Kapitel über Referenzen und Anleihen] (https://doc.rust-lang.org/stable/book/references-and-borrowing.html#the-rules) deckt die Tatsache ab, dass Sie möglicherweise keine anderen Referenzen im Internet haben Gleichzeitig haben Sie zum Beispiel eine veränderbare Referenz. – Shepmaster

Antwort

2

Intuitiv, Game s sollte wahrscheinlich ihre Sprite s besitzen. Hier ist eine aktualisierte Version, die diese Designänderung widerspiegelt. Auch auf der 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

Und wenn Sprite diese riesige Struktur ist, die du nicht kopieren willst, kannst du sie in eine 'Box' legen. –

+0

[Aktualisierter Code] (https://play.rust-lang.org/?gist=017bf2f07d346ee393107c9fe0e882e8&version=stable&backtrace=0) mit 'Box' –