如何 return 引用递归数据结构的一部分?
How do I return a reference to a part of a recursive data structure?
我正在尝试在 Rust 中定义一个递归数据结构,但在我对 Rust 和内存的理解中缺少一些部分 - 我唯一能做的就是与借用检查器打架。
我有以下四叉树存根,并希望按如下方式投影其中一个象限。
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(),
^~~~~~~~~~~
这里有两个选择。
首先,您可以return对子树的引用:
fn nw(&self) -> &CC {
match *self {
Node(_, _, _, ref nw, _, _, _) => &**nw,
_ => panic!()
}
}
其次,你可以return一个引用计数指针:
fn nw(&self) -> Rc<CC> {
match *self {
Node(_, _, _, ref nw, _, _, _) => nw.clone()
_ => panic!()
}
}
您不能 return 只是 CC
,但是,除非您愿意克隆值本身。原因是这将意味着移出 Rc
,使其处于某种未定义的状态,这是被正确禁止的。
我正在尝试在 Rust 中定义一个递归数据结构,但在我对 Rust 和内存的理解中缺少一些部分 - 我唯一能做的就是与借用检查器打架。
我有以下四叉树存根,并希望按如下方式投影其中一个象限。
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(),
^~~~~~~~~~~
这里有两个选择。
首先,您可以return对子树的引用:
fn nw(&self) -> &CC {
match *self {
Node(_, _, _, ref nw, _, _, _) => &**nw,
_ => panic!()
}
}
其次,你可以return一个引用计数指针:
fn nw(&self) -> Rc<CC> {
match *self {
Node(_, _, _, ref nw, _, _, _) => nw.clone()
_ => panic!()
}
}
您不能 return 只是 CC
,但是,除非您愿意克隆值本身。原因是这将意味着移出 Rc
,使其处于某种未定义的状态,这是被正确禁止的。