首页 文章

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

提问于
浏览
10

这个函数的实现是什么:

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 回答

  • 17

    取消引用值:

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

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

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

相关问题