2015-07-23 26 views
5

È a mia conoscenza che quando una variabile il cui tipo implementa Drop non rientra nell'intervallo, viene inserita una chiamata alla funzione fn drop(&mut self) e viene passato un riferimento mutabile appena creato alla variabile che non rientra nell'ambito.In che modo una chiamata al destructor chiama `fn drop (& mut self)` quando la variabile proprietaria è immutabile?

Tuttavia, come è possibile nei casi in cui la variabile era immutabilmente legata e sarebbe illegale prenderla in prestito in modo mutabile? Ecco un esempio di cosa sto parlando:

fn main() { 
    let x = vec![1, 2, 3]; 
    let y = &mut x; 
} 

che produce il seguente errore: non può prendere in prestito variabile locale immutabile x come mutabile come previsto.

Qualcosa di simile deve accadere quando x si interrompe, perché drop si aspetta un riferimento modificabile.

risposta

7

Il titolare di una variabile ottiene per decidere la mutevolezza quando legame si crea la variabile, non è intrinseco al valore stesso:

fn main() { 
    let x = vec![1, 2, 3]; 
    let mut z = x; 
    let y = &mut z; 
} 

si può pensare di far cadere, come succede quando l'ultimo programmer- l'associazione variabile denominata dà la proprietà della variabile. La magica Drop-fairy assume la proprietà della tua variabile ora non necessaria e utilizza un binding mutabile. Quindi Drop-fairy può chiamare Drop::drop prima di eseguire la magia finale per liberare lo spazio occupato dall'elemento stesso.

Note il Drop-fairy non è ancora un vero concetto di ruggine. Quella RFC è ancora in una fase molto preliminare.

+0

Si potrebbe dire che il valore è * spostato * nell'argomento di 'drop'. Proprio come puoi spostare 'x' in' z', puoi spostarlo in 'drop' ...? –

+0

@KerrekSB tranne per il fatto che il rilascio prende il suo ricevitore * per riferimento * non * per valore *, quindi nulla viene spostato in 'Drop :: drop'. – Shepmaster

+2

Hm, quindi è più come se fosse stato spostato in una posizione di distruzione privata, da dove viene chiamato 'drop'. –