Data structures 如何返回对递归数据结构一部分的引用?
我试图在Rust中定义一个递归数据结构,但在我对Rust和内存的理解中缺少了一些内容——我唯一能做的就是与借用检查器进行斗争 我有一个四叉树的下面的存根,我想投影其中一个四叉树,如下所示Data structures 如何返回对递归数据结构一部分的引用?,data-structures,rust,Data Structures,Rust,我试图在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(&a
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!()
}
}
}
你有两个选择 首先,可以返回对子树的引用:
fn nw(&self) -> &CC {
match *self {
Node(_, _, _, ref nw, _, _, _) => &**nw,
_ => panic!()
}
}
其次,可以返回引用计数指针:
fn nw(&self) -> Rc<CC> {
match *self {
Node(_, _, _, ref nw, _, _, _) => nw.clone()
_ => panic!()
}
}
fn nw(&self)->Rc{
匹配自我{
节点(u,u,u,ref nw,u,u,u)=>nw.clone()
_=>恐慌!()
}
}
但是,您不能仅返回
CC
,除非您愿意克隆值本身。原因是这将意味着离开Rc
,使其处于某种未定义状态,这是正确禁止的。这里有两种选择
首先,可以返回对子树的引用:
fn nw(&self) -> &CC {
match *self {
Node(_, _, _, ref nw, _, _, _) => &**nw,
_ => panic!()
}
}
其次,可以返回引用计数指针:
fn nw(&self) -> Rc<CC> {
match *self {
Node(_, _, _, ref nw, _, _, _) => nw.clone()
_ => panic!()
}
}
fn nw(&self)->Rc{
匹配自我{
节点(u,u,u,ref nw,u,u,u)=>nw.clone()
_=>恐慌!()
}
}
但是,您不能仅返回
CC
,除非您愿意克隆值本身。原因是这将意味着离开Rc
,使其处于某种未定义状态,这是正确禁止的。这里有两种选择
首先,可以返回对子树的引用:
fn nw(&self) -> &CC {
match *self {
Node(_, _, _, ref nw, _, _, _) => &**nw,
_ => panic!()
}
}
其次,可以返回引用计数指针:
fn nw(&self) -> Rc<CC> {
match *self {
Node(_, _, _, ref nw, _, _, _) => nw.clone()
_ => panic!()
}
}
fn nw(&self)->Rc{
匹配自我{
节点(u,u,u,ref nw,u,u,u)=>nw.clone()
_=>恐慌!()
}
}
但是,您不能仅返回
CC
,除非您愿意克隆值本身。原因是这将意味着离开Rc
,使其处于某种未定义状态,这是正确禁止的。这里有两种选择
首先,可以返回对子树的引用:
fn nw(&self) -> &CC {
match *self {
Node(_, _, _, ref nw, _, _, _) => &**nw,
_ => panic!()
}
}
其次,可以返回引用计数指针:
fn nw(&self) -> Rc<CC> {
match *self {
Node(_, _, _, ref nw, _, _, _) => nw.clone()
_ => panic!()
}
}
fn nw(&self)->Rc{
匹配自我{
节点(u,u,u,ref nw,u,u,u)=>nw.clone()
_=>恐慌!()
}
}
但是,您不能仅返回
CC
,除非您愿意克隆值本身。原因是,这将意味着移出Rc
,使其处于某种未定义状态,这是正确禁止的。是否要返回与树中不同的CC
,或对同一个的引用?您返回的nw
类型表明它将是前者。我想返回对树中存在的同一节点的引用。您想返回与树中的节点不同的CC
,还是返回对同一节点的引用?您返回的nw
类型表明它将是前者。我想返回对树中存在的同一节点的引用。您想返回与树中的节点不同的CC
,还是返回对同一节点的引用?您返回的nw
类型表明它将是前者。我想返回对树中存在的同一节点的引用。您想返回与树中的节点不同的CC
,还是返回对同一节点的引用?您返回的nw
类型表明它将是前者。我想返回对树中相同节点的引用。我认为对于第一种情况,您现在可以说节点(,,,,ref nw,,,,)=>nw
,因为强制更灵活。谢谢!当然,返回Rc而不是CC是有意义的。我认为对于第一种情况,您现在可以说节点(,,,,ref-nw,,,,)=>nw,因为强制更灵活。谢谢!当然,返回Rc而不是CC是有意义的。我认为对于第一种情况,您现在可以说节点(,,,,ref-nw,,,,)=>nw,因为强制更灵活。谢谢!当然,返回Rc而不是CC是有意义的。我认为对于第一种情况,您现在可以说节点(,,,,ref-nw,,,,)=>nw,因为强制更灵活。谢谢!当然,返回Rc而不是CC是有意义的。