如何从"Box"中获取自有值?

Cal*_*mer 20 unsafe rust

这个函数的实现是什么:

fn unbox<T>(value: Box<T>) -> T {
    // ???
}
Run Code Online (Sandbox Code Playgroud)

文档中唯一看起来像我想要的功能Box::into_raw.以下将进行类型检查:

fn unbox<T>(value: Box<T>) -> T {
    *value.into_raw()
}
Run Code Online (Sandbox Code Playgroud)

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

fn unbox<T>(value: Box<T>) -> T {
    unsafe { *value.into_raw() }
}
Run Code Online (Sandbox Code Playgroud)

这是正确的实施吗?如果是这样,为什么它不安全?这是什么意思?

也许这个问题显示了我对如何Box实际工作的一般不确定性.

She*_*ter 37

取消引用该值:

fn unbox<T>(value: Box<T>) -> T {
    *value
}
Run Code Online (Sandbox Code Playgroud)

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

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

  • 我希望有一个明确的方法:( (5认同)
  • @Calebmer 有 [`*` 和 `Deref` 之间的区别](http://stackoverflow.com/q/31624743/155423),**和**框在这种情况下是特殊的。 (2认同)
  • 看起来有一个显式的方法即将到来。`Box::into_inner()` 目前为每晚。 (2认同)

归档时间:

查看次数:

10664 次

最近记录:

9 年,4 月 前