2015-07-23 10 views
5

Rozumiem, że gdy zmienna, której typ implementuje Drop, wykracza poza zakres, zostaje wywołane wywołanie funkcji fn drop(&mut self) i przekazuje nowo utworzone zmienne odniesienie do zmiennej wychodzącej poza zakres.W jaki sposób wywoływane jest wywołanie `fn drop (& mut self)`, gdy zmienna posiadająca jest niezmienna?

Jak to jest możliwe w przypadku, gdy zmienna została powiązana w sposób niezmienny, a byłoby to niezgodne z prawem? Oto przykład tego, co mówię:

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

która produkuje następujący błąd: nie może pożyczyć niezmienna zmiennej lokalnej x jako zmienny, jak oczekiwano.

Coś podobnego musi się zdarzyć, gdy x zostanie upuszczone, ponieważ drop oczekuje odwołania do zmiennej.

Odpowiedz

7

właściciel zmiennej dostaje zdecydować zmienność gdy zmienna Wiązanie powstaje, nie jest nieodłączną wartością samą:

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

Można myśleć o upuszczenie jak dzieje się, gdy ostatni programmer- nazwane powiązanie zmiennej oddaje własność zmiennej. Magiczna kropla-wróżka przejmuje na własność zmienną teraz niepotrzebną i używa zmiennego wiązania. Następnie wróżka może zadzwonić pod numer Drop::drop przed wykonaniem ostatecznej magii, aby zwolnić miejsce zajmowane przez sam przedmiot.

Uwaga Drop-fairy nie jest jeszcze prawdziwą koncepcją Rust. To RFC wciąż znajduje się na bardzo wstępnym etapie.

+0

Można powiedzieć, że wartość jest * przeniesiona * do argumentu 'drop'. Tak jak możesz przenieść 'x' do' z', możesz przenieść go do 'drop' ...? –

+0

@KerrekSB z tą różnicą, że drop przyjmuje swój odbiornik * przez referencję * nie * według wartości *, więc nic nie jest przenoszone do 'Drop :: drop'. – Shepmaster

+2

Hm, więc bardziej przypomina to przeniesienie do prywatnego miejsca zniszczenia, skąd pochodzi 'drop'. –

Powiązane problemy