Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/rust/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Data structures 如何返回对递归数据结构一部分的引用?_Data Structures_Rust - Fatal编程技术网

Data structures 如何返回对递归数据结构一部分的引用?

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

我试图在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!()
        }
    }
}

你有两个选择

首先,可以返回对子树的引用:

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是有意义的。