2017-02-16 20 views
7

Co jest realizacja tej funkcji:Jak uzyskać wartość własności z "Box"?

fn unbox<T>(value: Box<T>) -> T { 
    // ??? 
} 

Jedyną funkcją w dokumentacji, która wygląda jak to, co chcę jest Box::into_raw. Następujące będzie sprawdzić:

fn unbox<T>(value: Box<T>) -> T { 
    *value.into_raw() 
} 

Daje to błąd error[E0133]: dereference of raw pointer requires unsafe function or block. Zawijanie go w blok unsafe { ... } naprawia go.

fn unbox<T>(value: Box<T>) -> T { 
    unsafe { *value.into_raw() } 
} 

Czy to jest poprawna realizacja? Jeśli tak, dlaczego nie jest to bezpieczne? Co to znaczy?

Być może to pytanie pokazuje moją ogólną niepewność co do tego, w jaki sposób działa Box.

+1

Uwaga: w proponowanej implementacji przeciekamy pamięć przydzieloną przez 'Box'. –

Odpowiedz

11

dereference wartości:

fn unbox<T>(value: Box<T>) -> T { 
    *value 
} 

Droga z powrotem w pre-1,0 Rust, wartości sterty przydzielone były bardzo specjalne rodzaje i użyli sigil ~ (jak w ~T). Wzdłuż drogi do Rust 1.0 większość tej specjalnej obudowy została usunięta ... ale nie cała.

Ta szczególna specjalność nosi nazwę "ruch deref", a istnieje proto-RFC o wspieraniu go jako koncepcji pierwszej klasy. Do tego czasu odpowiedź brzmi: "ponieważ Box jest wyjątkowy".

+0

Dlaczego nie próbowałem tego? Wydaje się, że cecha 'Deref' zwraca' & T'. Czy nie rozumiem, co robi operator '*', czy też skrzynie są naprawdę wyjątkowe? – Calebmer

+0

@Calebmer istnieje [różnica między '* i Deref'] (http://stackoverflow.com/q/31624743/155423), ** i ** są w tym przypadku specjalne. – Shepmaster

+1

Chciałbym, aby zamiast tego była wyraźna metoda :( –