在实现graph时,不能作为可变借用,因为它已经被借用了



我试图通过让每个节点存储对其邻居的引用来实现一个图结构。具体来说,我试图使一个网格,其中每个节点有引用多达4个邻居-像一个"2D链接列表"。

但是我在分配引用时得到一个错误。这个极简的例子再现了我的问题:

#[derive(Clone)]
struct Node<'a> {
neighbor: Option<&'a Node<'a>>, // optional reference to another Node
}
fn main() {
// a bunch of nodes:
let mut nodes: Vec<Node> = vec![ Node{neighbor: None}; 100];
// I want node 0 to have a reference to node 1
nodes[0].neighbor = Some(&nodes[1]);
}

产生以下错误:

error[E0502]: cannot borrow `nodes` as mutable because it is also borrowed as immutable
--> src/main.rs:12:5
|
12 |     nodes[0].neighbor = Some(&nodes[1]);
|     ^^^^^------------------------------
|     |                         |
|     |                         immutable borrow occurs here
|     mutable borrow occurs here
|     immutable borrow later used here
error: aborting due to previous error
For more information about this error, try `rustc --explain E0502`.

我正在努力弄清楚这应该如何在Rust中完成。我应该用指针代替吗?

由于创建借阅检查器的原因,您不能完全实现这种数据结构。它告诉你,你的数据结构不可能是安全的。

不安全的原因很简单。

假设您创建了一个包含两个元素的图,第一个元素引用第二个元素。现在你想让第二个引用第一个。要修改您的图,您需要获得对结构的可变访问。但是,如果您对它进行可变访问,那么没有什么可以阻止您从图中删除第二个节点,从而使第一个节点中的引用无效。

因此,借用检查器不允许你这样做。

你的方法是使用索引而不是引用。这将有额外的好处:当你想要序列化/反序列化你的结构时,你将完全没有问题。

相关内容

最新更新