如何从“盒子”中获得拥有的价值?

Posted

技术标签:

【中文标题】如何从“盒子”中获得拥有的价值?【英文标题】:How do I get an owned value out of a `Box`? 【发布时间】:2017-07-04 23:30:17 【问题描述】:

这个函数的实现是什么:

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() 

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

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

【问题讨论】:

注意:在您提议的实现中,您正在泄漏由Box 分配的内存。 【参考方案1】:

取消引用值:

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


早在 1.0 之前的 Rust 中,堆分配的值是非常特殊的类型,它们使用符号~(如~T)。在通往 Rust 1.0 的道路上,大部分这种特殊情况都被删除了……但不是全部。

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

另见:

Dereferencing Box<T> gives back value instead of reference

【讨论】:

我为什么不尝试呢? Deref 特征似乎返回 &amp;T。我不明白* 操作符是做什么的,还是盒子真的很特别? @Calebmer 有a difference between * and Deref框在这种情况下是特殊的。 我希望有一个明确的方法来代替:( 如果添加了显式方法并删除了特殊行为,会导致很多代码中断吗?这可以在一个版本中更改吗? @tipografieromonah 如果您有参考,则无法获得拥有的价值。见Cannot move out of borrowed content / cannot move out of behind a shared reference; Cannot move out of borrowed content when trying to transfer ownership。如需参考,请参阅How to get a reference to a concrete type from a trait object?; Why doesn't Rust support trait object upcasting?.

以上是关于如何从“盒子”中获得拥有的价值?的主要内容,如果未能解决你的问题,请参考以下文章

如何将销售价值从 9999.99 转换为 9.999,99

时间的价值

我如何从反应模式引导中获得价值?

如何从剑道组合框获得价值

从 Swift 中的 NsDIctionary 获取价值

如何从上次交易中获得价值,但不是今天的交易