如何从 `Box` 中获取拥有的值?
How do I get an owned value out of a `Box`?
这个函数的实现是什么:
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
的实际工作方式的普遍不确定性。
取消引用值:
fn unbox<T>(value: Box<T>) -> T {
*value
}
还有一个 nightly 相关函数 into_inner
您也可以使用:
#![feature(box_into_inner)]
fn unbox<T>(value: Box<T>) -> T {
Box::into_inner(value)
}
回到 Rust 1.0 之前的版本,heap-allocated 值是 非常特殊的 类型,他们使用印记 ~
(如 ~T
).在通往 Rust 1.0 的道路上,大部分 special-casing 都被删除了……但不是全部。
这个特殊的专业被称为“deref move”,并且有一个 proto-RFC 关于支持它作为一个 first-class 概念。在那之前,答案是“因为 Box
很特别”。
另请参阅:
这个函数的实现是什么:
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
的实际工作方式的普遍不确定性。
取消引用值:
fn unbox<T>(value: Box<T>) -> T {
*value
}
还有一个 nightly 相关函数 into_inner
您也可以使用:
#![feature(box_into_inner)]
fn unbox<T>(value: Box<T>) -> T {
Box::into_inner(value)
}
回到 Rust 1.0 之前的版本,heap-allocated 值是 非常特殊的 类型,他们使用印记 ~
(如 ~T
).在通往 Rust 1.0 的道路上,大部分 special-casing 都被删除了……但不是全部。
这个特殊的专业被称为“deref move”,并且有一个 proto-RFC 关于支持它作为一个 first-class 概念。在那之前,答案是“因为 Box
很特别”。
另请参阅: