2015-02-14 27 views
6

Qualcuno può spiegare perché lo spostamento di valori in strutture prese in prestito è valido mentre spostarli non è? Ad esempio:Spostamento verso e da una struttura mutuata in prestito

struct S { 
    v: Vec<u8> 
} 

fn move_v_out(s: &mut S) { 
    let old_vecotr = s.v; // If removed, program compiles fine 
    s.v = vec![]; 
} 

fn main() { 
    let mut v = S { 
     v: vec![] 
    }; 
    move_v_out(&mut v); 
} 

In entrambi i casi, viene modificato un membro di una struttura mutuata in prestito. Tuttavia si causa un errore di compilazione.

risposta

9

La differenza principale è che quando si sposta un valore da una struttura presa in prestito, lo si lascia in uno "stato parzialmente spostato", che impedisce di utilizzarlo come struttura intera in un secondo momento.

E questo stato è vietato per i valori presi in prestito, in quanto devono essere ancora validi alla fine della funzione e il compilatore non (ancora?) Capisce che si sta impostando il valore correttamente in seguito.

Tuttavia, se ciò che si vuole fare è estrarre il vecchio Vec e sostituirlo con uno nuovo, la libreria standard contiene esattamente la funzione è necessario: std::mem::replace

fn move_v_out(s: &mut S) { 
    let old_vector = std::mem::replace(&mut s.v, vec![]); 
    // do something with old_vector 
} 
Problemi correlati