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(¤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