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

迷宫

我试图通过让每个节点存储对其邻居的引用来实现图形结构。具体来说,我正在尝试制作一个网格,其中每个节点都引用最多 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 中完成。我应该使用指针吗?

马克西姆·格里森科

由于创建借用检查器的原因,您无法完全实现此类数据结构。它告诉你你的数据结构不可能是安全的。

它不安全的原因很简单。

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

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

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

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

不能借用可变的self.hash,因为它也被借为不可变的

错误:不能借用......作为不可变的,因为它也被借为可变的

不能借用可变的Rc

不能借用 `self.blocks` 作为可变的,因为它也被借用为不可变的

不能借用为不可变的,因为它也借用为可变的

不合理的“不能借用 `a` 作为不可变的,因为它也被借用为可变的”?

不能借用* self作为可变的,因为它也借作不可变的

错误 [E0502]: 不能借用 `char_array` 作为可变的,因为它也被借用为不可变的

不能借用可变的借项,因为它在`&`引用后面

借阅检查器:不能借为不可变的,因为它也借为可变的

不能借X为不可变的,因为X也被借为可变的

不能借来不可变,因为它也借来可变

不能借来可变,因为它也借来不可变

在嵌套数组索引中“不能借为不可变的,因为它也被借为可变的”是什么意思?

不能借为不可变-String和len()

不能将 <var> 借用为不可变,因为它也被借用,因为这里发生了可变不可变借用

不能借用 `&` 引用中的数据作为向量推送中的可变数据

为什么不能借用盒装矢量内容作为可变内容?

结构方法:不能以可变方式借用,因为它也以不可变的方式借用

“不能将 `*arr` 作为不可变借用,因为它也作为可变借用”在函数调用中

“不能将'graph`借作不变的,因为它也被借为可变的。” 如何让Rust知道我已经完成了该可变借款?

为什么不能借用盒装结构作为特征?

借用 self 作为可变的并且不可能借用 self 的成员?

代码可以不借用而工作,但是我不能借用它

Apache无法重新启动,因为它已经使用了其端口

在不可变迭代器上运行 next 时不能作为可变借用(没有其他借用)

Rust 问题:当元组在向量内时,不能可变和不可变地借用部分元组

不能使用Vec两次,我不能借用它

循环中不能多次借用可变的错误