如何从“Box”中获取自有值?

时间:2017-02-16 03:02:26

标签: rust unsafe

此功能的实施是什么:

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实际工作方式的一般不确定性。

1 个答案:

答案 0 :(得分:23)

取消引用该值:

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

回到1.0之前的Rust,堆分配的值是非常特殊的类型,他们使用了sigil ~(如~T中所示)。沿着通往Rust 1.0的道路,大部分特殊套管被拆除了......但不是全部。

这个特殊的专业名称为“deref move”,并且有一个proto-RFC关于支持它作为一流的概念。在那之前,答案是“因为Box是特殊的”。