2015-07-23 15 views
5

Es versteht sich, dass wenn eine Variable, deren Typ Drop implementiert außerhalb Geltungsbereich, einen Aufruf an die fn drop(&mut self) Funktion eingefügt wird, und übergeben eine neu erstellte veränderbare Verweis auf die Variable außerhalb des Bereichs.Wie wird ein Destruktoraufruf `fn drop (& mut self)` aufgerufen, wenn die besitzende Variable unveränderlich ist?

Wie ist das möglich in Fällen, in denen die Variable untrennbar gebunden war und es illegal wäre, sie variabel zu borgen? Hier ist ein Beispiel dafür, was ich spreche:

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

Welche die folgenden Fehler erzeugt: nicht unveränderlich lokalen Variable x wie wandelbar wie erwartet leihen.

Etwas ähnliches muss passieren, wenn x fallen gelassen würde, weil drop eine veränderbare Referenz erwartet.

Antwort

7

Der Besitzer einer Variablen erhält die Veränderlichkeit zu entscheiden, wann die Variable erstellt wird, Bindung, es nicht auf den Wert Eigen ist selbst:

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

Sie fallen zu lassen, wie geschieht denken kann, wenn der letzte Programmiergeräte- Benannte Variablenbindung gibt den Besitz der Variablen auf. Die magische Drop-Fee übernimmt Besitz an Ihrer jetzt nicht benötigten Variable und verwendet eine veränderbare Bindung. Dann kann die Drop-Fee Drop::drop aufrufen, bevor sie die letzte Magie einsetzt, um den Platz freizugeben, den das Item selbst eingenommen hat.

Hinweis Die Drop-Fee ist noch kein echtes Rust-Konzept. Dieser RFC befindet sich noch in einem sehr frühen Stadium.

+0

Man könnte sagen, dass der Wert * in das Argument 'drop' * verschoben wurde. Genau wie du 'x' in' z' verschieben kannst, kannst du es in 'drop' verschieben ...? –

+0

@KerrekSB mit der Ausnahme, dass drop seinen Empfänger * durch Referenz * not * nach Wert * nimmt, also wird nichts in 'Drop :: drop' verschoben. – Shepmaster

+2

Hm, es ist eher so, als wäre es in einen privaten Destruktionsort umgezogen, von wo 'Drop' genannt wird. –