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

时间:2015-02-15 20:52:42

标签: data-structures rust

我试图在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(),
                                                                 ^~~~~~~~~~~

1 个答案:

答案 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,使其处于某种未定义的状态,这是正确的禁止状态。