我如何得到一个拥有的价值从一个“盒子”?

这一功能的实现方式是什么:

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

文档中唯一与我想要的类似的函数是 Box::into_raw:

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

这给出了错误 error[E0133]: dereference of raw pointer requires unsafe function or block。将其包装在 unsafe { ... }块中可以修复它。

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

这是正确的实现吗? 如果是,为什么不安全? 这意味着什么?

也许这个问题显示了我对 Box实际工作方式的普遍不确定性。

51611 次浏览

取消参考值:

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

有一个夜间关联的函数 into_inner你也可以使用:

#![feature(box_into_inner)]
fn unbox<T>(value: Box<T>) -> T {
Box::into_inner(value)
}

早在1.0 Rust 之前,堆分配的值是 非常特别类型,它们使用的是字符 ~(与 ~T一样)。在通往 Rust 1.0的道路上,大部分特殊外壳被移除了... 但并非全部。

这个特殊的专业被称为“ deref move”,有一个 原始 RFC关于支持它作为一个一流的概念。在那之前,答案是“因为 Box很特别”。

参见: