我试图在Rust中定义一个递归数据结构,但是我对Rust和内存的理解中缺少一些部分 - 我唯一能做的就是选择与借用检查器进行斗争。< / p>
我有一个四叉树的以下存根,并且想要按如下方式投影其中一个象限。
use CC::{Node, Leaf};
enum CC {
Node(i32, bool, i32, Rc<CC>, Rc<CC>, Rc<CC>, Rc<CC>),
Leaf(bool),
}
impl CC {
fn nw(&self) -> CC {
match *self {
Node(_, _, _, ref nw, _, _, _) => *nw.clone(),
_ => panic!()
}
}
}
但我最终得到的是
src/hashlife.rs:34:47: 34:58 error: cannot move out of borrowed content
src/hashlife.rs:34 Node(_, _, _, ref nw, _, _, _) => *nw.clone(),
^~~~~~~~~~~
答案 0 :(得分:3)
这里有两个选择。
首先,您可以返回对子树的引用:
fn nw(&self) -> &CC {
match *self {
Node(_, _, _, ref nw, _, _, _) => &**nw,
_ => panic!()
}
}
其次,您可以返回引用计数指针:
fn nw(&self) -> Rc<CC> {
match *self {
Node(_, _, _, ref nw, _, _, _) => nw.clone()
_ => panic!()
}
}
但是,除非您愿意克隆值本身,否则您无法仅返回CC
。原因是这意味着退出Rc
,使其处于某种未定义的状态,这是正确的禁止状态。