这个函数的实现是什么:
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实际工作的一般不确定性.
我遇到了与Rust的所有权规则和特征对象垂头丧气的冲突.这是一个示例:
use std::any::Any;
trait Node{
fn gen(&self) -> Box<Node>;
}
struct TextNode;
impl Node for TextNode{
fn gen(&self) -> Box<Node>{
Box::new(TextNode)
}
}
fn main(){
let mut v: Vec<TextNode> = Vec::new();
let node = TextNode.gen();
let foo = &node as &Any;
match foo.downcast_ref::<TextNode>(){
Some(n) => {
v.push(*n);
},
None => ()
};
}
Run Code Online (Sandbox Code Playgroud)
该TextNode::gen方法必须返回Box<Node>而不是Box<TextNode>,所以我必须将它转发给Box<TextNode>.
Any::downcast_ref的回报值是Option<&T>,所以我无法取得低估结果的所有权并推动它v.
====编辑=====
由于我不擅长英语,我的问题很模糊.
我真正需要的是一个载体,Vec<Box<Node>>或者Vec<Box<Any>>,它可以包含TextNode …