此功能的实施是什么:
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
实际工作方式的一般不确定性。
答案 0 :(得分:23)
取消引用该值:
fn unbox<T>(value: Box<T>) -> T {
*value
}
回到1.0之前的Rust,堆分配的值是非常特殊的类型,他们使用了sigil ~
(如~T
中所示)。沿着通往Rust 1.0的道路,大部分特殊套管被拆除了......但不是全部。
这个特殊的专业名称为“deref move”,并且有一个proto-RFC关于支持它作为一流的概念。在那之前,答案是“因为Box
是特殊的”。