2015-03-03 11 views
8

Sono nuovo di Rust e sto cercando di riprendere il concetto di proprietà/prestito. Ora ho ridotto il mio codice a questo esempio di codice minimo che fornisce un errore di compilazione.Ottieni un campo enum da una struttura: non posso spostarmi dal contenuto preso in prestito

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. 

Sono ancora in tutto viene copiato per valore mentalità, dove è perfettamente legale per fare self.color come che mi sarebbe ottenere una copia di Color. Apparentemente, ho torto. Ho trovato altre domande su questo stesso errore su SO, ma nessuna soluzione al mio problema.

A quanto ho capito, il campo è di proprietà di chiunque possieda lo Display. Poiché ho preso in prestito solo un riferimento allo Display, non lo possiedo. Estrarre color tentativi di trasferire la proprietà di il Color a me, che non è possibile poiché non possiedo il Display. È corretto?

Come si risolve?

risposta

10

Sono ancora il tutto viene copiato dalla mentalità valore, dove è perfettamente legale per fare self.color come che mi sarebbe ottenere una copia di colore. Apparentemente, mi sbaglio. Ho trovato altre domande su questo stesso errore su SO, ma nessuna soluzione al mio problema.

Tutto ciò che può essere copiato nella ruggine deve essere marchiato esplicitamente con un tratto Copy. Copy era implicito nel passato ma è stato modificato (rfc).

A quanto ho capito, il campo è di proprietà di chi possiede il display. Dato che ho preso in prestito solo un riferimento al Display, non lo possiedo. L'estrazione del colore tenta di trasferire la proprietà del colore a me, che non è possibile poiché non possiedo il display. È corretto?

Sì. Quando si verifica questo errore ci sono tre possibili soluzioni:

  • derivare il tratto Copy per il tipo (se del caso)
  • Usa/derivare Clone (self.color.clone())
  • restituire un riferimento

Per risolvere questo si derivano Copy per Color:

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

Questo è lo stesso:

impl Copy for Color {} 
+0

dovremmo usare '# [derivare (Copy, Clone)]' 'dal Copy' ha' Clone' come il supertrait (come spiegato in [questa risposta] (http : // StackOverflow.it/questions/30782836/the-trait-clone-è-non-implementato-quando-deriva-the-trait-copy-for-enum)) –

+0

@TaThanhDinh Grazie, risolto. Non sono sicuro che sia stato così quando ho risposto a questa domanda. – Arjan