2015-03-03 6 views
8

Ich bin zu Rust neu und versuchend, meinen Kopf um das Besitz-/Entleihenkonzept einzuwickeln. Jetzt habe ich meinen Code auf dieses minimale Codebeispiel reduziert, das einen Kompilierungsfehler ergibt.Erhalte ein enum Feld von einer Struktur: kann nicht aus geliehenem Inhalt heraus bewegen

pub struct Display { 
    color: Color, 
} 

pub enum Color { 
    Blue   = 0x1, 
    Red   = 0x4, 
} 

impl Display { 
    fn get_color_value(&self) -> u16 { 
     self.color as u16 
    } 
} 
src/display.rs:12:9: 12:13 error: cannot move out of borrowed content 
src/display.rs:12   self.color as u16 
          ^~~~ 
error: aborting due to previous error 
Could not compile. 

ich noch im bin alles wird von Wert Einstellung kopiert, wo es vollkommen legal ist self.color zu tun, als dass mir eine Kopie Color bekommen würde. Anscheinend liege ich falsch. Ich habe einige weitere Fragen zu diesem Fehler in SO gefunden, aber keine Lösung für mein Problem.

Wie ich es verstehe, ist das Feld im Besitz von wem die Display besitzt. Da ich nur eine Referenz auf die Display ausgeliehen habe, besitze ich sie nicht. Extrahieren color versucht, das Eigentum von die Color zu mir zu übertragen, was nicht möglich ist, da ich dienicht besitze. Ist das richtig?

Wie löse ich es?

Antwort

10

Ich bin immer noch in der alles von Wert Einstellung kopiert, wo es vollkommen legal ist self.color zu tun, als dass mir eine Kopie der Farbe bekommen würde. Anscheinend liege ich falsch. Ich habe einige andere Fragen zu diesem gleichen Fehler auf SO gefunden, aber keine Lösung für mein Problem.

Alles, was im Rost kopiert werden kann, muss explizit mit einem Merkmal Copy markiert sein. Copy war in der Vergangenheit implizit, aber das wurde geändert (rfc).

Wie ich es verstehe, gehört das Feld, wem das Display gehört. Da ich nur einen Verweis auf das Display ausgeliehen habe, besitze ich es nicht. Extrahieren von Farben versucht, das Eigentum der Farbe zu mir zu übertragen, was nicht möglich ist, da ich nicht das Display besitze. Ist das richtig?

Ja. Wenn dieser Fehler auftritt, gibt es drei mögliche Lösungen:

  • Man leite das Merkmal Copy für den Typ (falls zutreffend)
  • Verwendung/ableiten Clone (self.color.clone())
  • Return eine Referenz

Um dies zu lösen, leiten Sie Copy für :

#[derive(Copy, Clone)] 
pub enum Color { 
    Blue   = 0x1, 
    Red   = 0x4, 
} 
Diese 10

ist die gleiche wie:

impl Copy for Color {} 
+0

sollten wir '# verwenden [ableiten (Kopieren, Clone)]' 'da Copy' hat' Clone' als supertrait (wie in [dieser Antwort] erklärt (http ://Paketüberfluss.com/questions/30782836/the-trait-clone-is-is-not-implementiert-wenn-abgeleitet-the-trait-copy-for-enum)) –

+0

@TaThanhDinh Danke, behoben. Nicht sicher, ob das der Fall war, als ich diese Frage beantwortete. – Arjan

Verwandte Themen