如何从“盒子”中获得拥有的价值?
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()
这是正确的实现吗?如果是这样,为什么它不安全?什么意思?
也许这个问题显示了我对Box
s 实际工作方式的普遍不确定性。
【问题讨论】:
注意:在您提议的实现中,您正在泄漏由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
特征似乎返回 &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?.以上是关于如何从“盒子”中获得拥有的价值?的主要内容,如果未能解决你的问题,请参考以下文章