【发布时间】:2016-06-14 13:02:48
【问题描述】:
我想为一个非常大(节点数)的图建模,该图由许多非常大(内存方面)的节点组成。由于节点如此之大,我只想将它们存储一次并将借用传递给它们,所以从概念上讲是这样的:
struct Graph<'a> {
nodes: Vec<Node<'a>>,
}
struct Node<'a> {
edges: HashMap<String, &'a Node>,
// ...lots of other data...
}
当然没有办法像这样构造Graph,因为(a)Vec 不允许我在元素借用时添加新节点,并且(b)我不能告诉 rustc nodes 向量将终生存在 'a。我也不能使用像Rc 这样的东西,因为图表有循环。
我想表达的是一个竞技场,它让我可以分配很多Nodes,只要竞技场存在,就可以对它们进行不可变的借用,并使用生命周期检查来确保我取消分配竞技场时,没有剩余的Node 引用。比如:
struct Graph<'a> {
nodes: Arena<'a, Node<'a>>,
}
struct Node<'a> {
edges: HashMap<String, &'a Node>,
}
impl<'a, A> Arena<'a, A> {
fn own(&self, a: A) -> &'a A {
// magic
}
}
impl<'a, A> Drop for Arena<'a, A> {
fn drop(&'a mut self) {
// magic
}
}
这在语义上可以用 Rust 表达吗?
【问题讨论】:
-
在crates.io 上搜索“arena”提供了许多结果。一个这样的箱子是typed-arena。
-
我也不能使用像
Rc这样的东西,因为图表有循环。 — 不完全正确;当您有周期性数据时,您可以引入Weak引用。 module-level documentation 有一个例子。 -
@Shepmaster
typed-arena实现让我可以借用,但这些借用绑定到&mut生命周期,我无法连接到竞技场的生命周期。不过,我会尝试使用弱引用。
标签: graph rust lifetime ownership