snippetrustCritical
How do I get an owned value out of a `Box`?
Viewed 0 times
boxhowvalueownedoutget
Problem
What is the implementation for this function:
The only function in the documentation that looks like what I want is
This gives the error
Is this the correct implementation? If so, why is it unsafe? What does it mean?
Perhaps this question shows my general uncertainty of how
fn unbox(value: Box) -> T {
// ???
}The only function in the documentation that looks like what I want is
Box::into_raw. The following will type check:fn unbox(value: Box) -> T {
*value.into_raw()
}This gives the error
error[E0133]: dereference of raw pointer requires unsafe function or block. Wrapping it in an unsafe { ... } block fixes it.fn unbox(value: Box) -> 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
Boxs actually work.Solution
Dereference the value:
There's a nightly associated function
Way back in pre-1.0 Rust, heap-allocated values were very special types, and they used the sigil
This particular specialty 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
See also:
fn unbox(value: Box) -> T {
*value
}
There's a nightly associated function
into_inner you can use as well:#![feature(box_into_inner)]
fn unbox(value: Box) -> T {
Box::into_inner(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 specialty 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:
- Dereferencing Box gives back value instead of reference
Context
Stack Overflow Q#42264041, score: 153
Revisions (0)
No revisions yet.