如何递归遵循自引用Rc?

时间:2018-10-05 16:09:44

标签: rust

我有一个带有可选自我引用的结构:

struct Pathnode {
    pos: Pos,
    parent: Option<Rc<Pathnode>>,
}

我要遵循parent参考,直到根节点之前的第一个子节点(根节点没有父节点)。我尝试了以下代码:

let mut head: Pathnode = node;
while head.parent.is_some() {
    head = *head.parent.unwrap();
}

但这无法编译并出现以下错误:

error[E0507]: cannot move out of borrowed content
   --> file.rs on line 134:24
    |
139 |                 head = *head.parent.unwrap();
    |                        ^^^^^^^^^^^^^^^^^^^^^ cannot move out of borrowed content

如何从Pathnode中获得Rc?或者,我可以为head使用什么其他数据类型?如果最后只得到不可变的引用或类似内容,也可以。

1 个答案:

答案 0 :(得分:3)

您应该使用引用而不是尝试移动值。这应该起作用:

let mut head: &Pathnode = &node;
while head.parent.is_some() {
    head = head.parent.as_ref().unwrap();
}

您的代码直接在unwrap()上调用parent,这消耗了Option。无法将字段移出结构。

一个不错的选择是使用while let

let mut head: &Pathnode = &node;
while let Some(ref parent) = head.parent  {
    head = parent;
}