gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 13:06:30 24 4
gpt4 key购买 nike

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

最佳答案

由于创建借用检查器的原因,您无法完全实现此类数据结构。它告诉你你的数据结构不可能是安全的。
它不安全的原因很简单。
假设您创建了一个包含两个元素的图形,第一个元素引用了第二个元素。现在您希望第二个引用第一个。要修改图形,您需要获得对结构的可变访问权限。但是,如果您获得了对它的可变访问权限,则没有什么可以阻止您从图中删除第二个节点,从而使第一个节点中的引用无效。
因此,借用检查器不允许您这样做。
适合您的方法是使用索引而不是引用。这将有额外的好处:当您想要序列化/反序列化您的结构时,您将完全没有问题。

关于rust - 在实现图时,不能借为可变的,因为它已经被借用了,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69224377/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com