2017-02-16 1 views
7

Was ist die Implementierung für diese Funktion:Wie bekomme ich einen eigenen Wert aus einer `Box`?

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

Die einzige Funktion in der Dokumentation, die wie das, was aussieht ich will, ist Box::into_raw. Der folgende Typ wird überprüft:

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

Dies gibt den Fehler error[E0133]: dereference of raw pointer requires unsafe function or block. Wrapping es in einem unsafe { ... } Block behebt es.

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

Ist dies die richtige Implementierung? Wenn ja, warum ist es unsicher? Was heißt das?

Vielleicht zeigt diese Frage meine allgemeine Unsicherheit, wie Box s tatsächlich funktionieren.

+1

Hinweis: In der von Ihnen vorgeschlagenen Implementierung wird der von 'Box' zugewiesene Speicher gelöscht. –

Antwort

11

Dereferenziere Wert:

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

Weg zurück in pre-1.0 Rust, Heap zugewiesenen Werte waren ganz besondere Typen und sie verwendet, um die Sigill ~ (wie in ~T). Entlang der Straße nach Rust 1.0 wurde der größte Teil dieses Spezialgehäuses entfernt ... aber nicht alles.

Diese besondere Spezialität trägt den Namen "deref move", und es gibt eine proto-RFC über die Unterstützung als ein erstklassiges Konzept. Bis dahin ist die Antwort "weil Box ist speziell".

+0

Warum habe ich das nicht versucht? Die 'Deref'-Eigenschaft scheint ein' & T' zurückzugeben. Versteh ich nicht, was der Operator '*' tut, oder sind Boxen wirklich nur etwas Besonderes? – Calebmer

+0

@Calebmer gibt es [ein Unterschied zwischen '*' und 'Deref'] (http://Stackoverflow.com/q/31624743/155423), ** und ** Felder sind in diesem Fall speziell. – Shepmaster

+1

Ich wünschte, es wäre stattdessen eine explizite Methode :( –

Verwandte Themen