【问题标题】:Implement a graph structure in Rust [duplicate]在 Rust 中实现图结构 [重复]
【发布时间】:2020-01-11 10:42:31
【问题描述】:

我正在尝试使用以下类型在 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

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

【问题讨论】:

  • 你不能那样做。使用Vec&lt;Rc&lt;RefCell&lt;Node&gt;&gt;&gt;
  • @FrenchBoiethios - 谢谢 - 作为Graph 类型还是edges 类型?还是他们都应该有那种类型?
  • 如果不去RefCell,我认为这会失去我想要的 Rust 的安全保证?
  • @NeilMitchell RefCell 不会失去安全保证,但确实会将它们从编译时转移到运行时。

标签: rust borrow-checker


【解决方案1】:

一旦多个结构可以指向您的一个节点,您将失去 Rust 内存保证的“单一所有者”世界,您将需要像 Rc 之类的东西,或者更深奥的是,弱引用.我完全建议阅读https://rust-unofficial.github.io/too-many-lists/ 来了解这个领域的许多细节。

【讨论】:

  • 这是一个很棒的链接!
猜你喜欢
  • 2019-06-20
  • 2021-01-01
  • 2020-06-21
  • 2023-02-07
  • 1970-01-01
  • 1970-01-01
  • 2021-08-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多