Rust 创建对父节点的引用时,借用值的有效期不够长

Rust 创建对父节点的引用时,借用值的有效期不够长,rust,ownership,Rust,Ownership,我试图学习生锈,为此我决定实现深度优先搜索算法 到目前为止,我有以下节点结构: #[derive(Debug)] pub struct Node<'a> { parent: Option<&'a Node<'a>>, position: crate::entities::Position, } 如何解决这个问题?您的基本问题是节点的管理。请注意,节点首先由矩阵创建,然后放入边界,最后移动到遍历。这意味着您不能使用对节点的引用,因为它们

我试图学习生锈,为此我决定实现深度优先搜索算法

到目前为止,我有以下节点结构:

#[derive(Debug)]
pub struct Node<'a> {
    parent: Option<&'a Node<'a>>,
    position: crate::entities::Position,
}

如何解决这个问题?

您的基本问题是节点的管理。请注意,节点首先由矩阵创建,然后放入
边界
,最后移动到
遍历
。这意味着您不能使用对节点的引用,因为它们可能会移动,从而使引用无效


解决方案是拥有节点的中央存储,然后在引用它们时使用索引。当然,这对
节点的实现不起作用,但您可以将其更改为使用索引而不是对父节点的引用。

是否使用
Rc
作为包装器选项?因为您尝试返回单个
节点
,虽然所有节点都是在
dfs
中创建的,但您必须使用
Rc
,因此整个节点结构的寿命比函数调用长,或者以某种方式返回dfs的整个拥有路径(例如作为
Vec
),我如何使用Rc,如下所示:parent:Option>,@Manuelarte Rc拥有自己的数据,因此不需要引用。但是,当我使用Rc::new(current)时,它会抱怨节点没有实现复制跟踪。这对本地人来说效果很好,但需要转换为可有效返回。
pub fn dfs<'a>(maze: &crate::entities::Maze) -> Node<'static> {
    let mut traversed = Vec::new();
    let mut frontier = Vec::new();
    let mut seen: HashSet<crate::entities::Position> = HashSet::new();

    let parent = Node {
        parent: None,
        position: maze.start // position is just a holder for row and column
    };
    frontier.push(parent);

    loop {
        if frontier.is_empty() {
            panic!("No solution found!")
        }
        let current: Node<'static> = frontier.pop().expect("There must be a node here");
        let position = current.position;
        if current.position == maze.exit {
            break current;
        } else {
            if !seen.contains(&current.position) {
                let neighbours = maze.get_neighbours(current.position).iter().map(|pos| Node {
                    parent: Some(&current), // this line is not compiling
                    position: *pos
                }).collect::<Vec<Node>>();
                frontier.append(&mut neighbours); 
                traversed.push(current);
            }
        }
        seen.insert(position);
    }
}
27 |                     parent: Some(&current),
   |                                   ^^^^^^^ borrowed value does not live long enough