如何解决创建对父节点的引用时,借入的值的寿命不足
我正在尝试学习Rust,为此,我决定实现深度优先搜索算法。
到目前为止,我具有以下Node结构:
#[derive(Debug)]
pub struct Node<'a> {
parent: Option<&'a Node<'a>>,position: crate::entities::Position,}
现在,我有了dfs算法:
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(¤t.position) {
let neighbours = maze.get_neighbours(current.position).iter().map(|pos| Node {
parent: Some(¤t),// this line is not compiling
position: *pos
}).collect::<Vec<Node>>();
frontier.append(&mut neighbours);
traversed.push(current);
}
}
seen.insert(position);
}
}
27 | parent: Some(¤t),| ^^^^^^^ borrowed value does not live long enough
我该如何解决?
解决方法
您的基本问题是节点的管理。注意,首先由矩阵创建一个节点,然后将其放入frontier
中,最后将其移至traversed
中。这意味着您不能使用对节点的引用,因为它们可能会移动,从而使引用无效。
解决方案是拥有节点的中央存储,然后在引用它们时使用索引。当然,这对您实现Node
并不合适,但是您可以将其更改为使用索引而不是对父母的引用。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。