rust - 在 Rust 中实现图形结构

标签 rust borrow-checker

我正在尝试使用以下类型在 Rust 中表示图形:

struct Node<'a> {
    edges: Vec<&'a Node<'a>>,
}
type Graph<'a> = Vec<Node<'a>>;

Graph 的约束是所有节点都指向同一向量中的其他节点。我可以创建一个单例图:

fn createSingleton<'a>() -> Graph<'a> {
    let mut items: Graph<'a> = Vec::new();
    items.push(Node { edges: Vec::new() });
    return items;
}

但是当我尝试创建一个有两个节点的图时,其中一个指向另一个:

fn createLink<'a>() -> Graph<'a> {
    let mut items: Graph<'a> = Vec::new();
    items.push(Node { edges: Vec::new() });
    items.push(Node { edges: vec![&items[0]] });
    return items;
}

我得到一个错误:

cannot borrow `items` as mutable because it is also borrowed as immutable

特别是 &items[0] 是一个不可变的借用,而第二个 items.push 似乎是一个可变的借用。是否可以构建我想要的内存布局?如果是,怎么办?

最佳答案

一旦不止一个结构可以指向你的一个节点,你就会失去 Rust 内存保证的“单一所有者”世界,你要么需要像 Rc 这样的东西,要么更深奥地,一个 weakref .我完全建议阅读 https://rust-unofficial.github.io/too-many-lists/了解这片领土的许多来龙去脉。

关于rust - 在 Rust 中实现图形结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57857832/

相关文章:

Rust,特征绑定(bind)选项未使用 process::Command 定义

rust - 为什么在调用一个方法时会借用一个移动的值,该方法使用也调用方法的参数来按值获取 self ?

process - 无法通过管道多次传入或传出生成的子进程

rust - 展开时无法移出共享引用后面的值

generics - 如何在 Rust 的泛型函​​数中同时使用非拥有迭代器和消耗迭代器?

security - Rust 中是否有安全/清理过的文件名函数

rust - Rust LinkedList 中的借用检查器错误的原因是什么?

enums - 我可以匹配所有具有相同值形状的枚举变体吗?

rust - Rust 中相同类型的相同特征的多个实现

rust - 在结构向量中借用