How do I get an owned value out of a `Box`?
Dereference the value:
fn unbox<T>(value: Box<T>) -> T {
*value
}
Way back in pre-1.0 Rust, heap-allocated values were very special types, and they used the sigil ~
(as in ~T
). Along the road to Rust 1.0, most of this special-casing was removed... but not all of it.
This particular speciality goes by the name "deref move", and there's a proto-RFC about supporting it as a first-class concept. Until then, the answer is "because Box
is special".
See also:
Calebmer
Updated on December 01, 2020Comments
-
Calebmer over 3 years
What is the implementation for this function:
fn unbox<T>(value: Box<T>) -> T { // ??? }
The only function in the documentation that looks like what I want is
Box::into_raw
. The following will type check:fn unbox<T>(value: Box<T>) -> T { *value.into_raw() }
This gives the error
error[E0133]: dereference of raw pointer requires unsafe function or block
. Wrapping it in anunsafe { ... }
block fixes it.fn unbox<T>(value: Box<T>) -> T { unsafe { *value.into_raw() } }
Is this the correct implementation? If so, why is it unsafe? What does it mean?
Perhaps this question shows my general uncertainty of how
Box
s actually work.