我想建模一个非常大(节点数)的图,它由许多非常大(内存)的节点组成。由于节点太大,我只想存储一次,并将借方传递给它们,因此在概念上是这样的:
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
因为该图具有循环。
我想表达的是一个各种各样的竞技场,它让我分配了很多
Node
s、 只要竞技场还活着,就向他们借不可变的钱,并使用终身检查来确保我没有剩余的钱
节点
竞技场取消分配时的参考。类似于:
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表达吗?