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