Rust 列表元素的多个所有者(列表所有者和多个引用者)——可能吗?
Multiple owners for Rust list elements (list owner and several referrers) - possible?
我们有一个结构 LinkedList
:
struct XPipeline {
handlers: LinkedList<XHandler>,
}
XPipeline
是所有 XHandler
对象的所有者,可以访问和修改它们。
我们已经有了处理程序列表;现在我们需要每个处理程序都可以引用列表中的邻居。也就是说,每个处理程序的方法都可以引用处理程序的邻居,修改它们并调用它们的方法。
我的第一个想法是这样的:我为每个处理程序提供 prev
和 next
字段,这些字段将引用邻居。通过向列表中添加一个新的处理程序,我使用相应的引用来初始化这些字段。现在我可以在所有处理程序的方法中使用这些引用。 (这在 C++ 中使用指针很容易)。
问题是:只允许一个所有者(即具有修改权限)。那个所有者(所有处理程序的)已经是一个 XPipeline
对象。我该如何解决?也许,通过雇用:
handlers: Rc<RefCell<LinkedList<XHandler>>>
但具体如何呢?
Rust 中针对数据结构中多个链接的策略之一是使用 Vec<T>
作为后备存储,然后使用 usize
"pointers".[=14 对其进行索引=]
您的情况类似于:
struct XPipeline {
head: usize,
storage: Vec<Node>,
}
struct Node {
handler: XHandler,
next: Option<usize>,
prev: Option<usize>,
}
簿记与您在 C++ 中使用的指针非常相似。
另请参阅 this discussion on Reddit 以了解在类图结构中处理所有权的方法。
我也会寻找实现双链表、跳跃列表、图表或类似内容的 crate,并从中获取灵感。
我们有一个结构 LinkedList
:
struct XPipeline {
handlers: LinkedList<XHandler>,
}
XPipeline
是所有 XHandler
对象的所有者,可以访问和修改它们。
我们已经有了处理程序列表;现在我们需要每个处理程序都可以引用列表中的邻居。也就是说,每个处理程序的方法都可以引用处理程序的邻居,修改它们并调用它们的方法。
我的第一个想法是这样的:我为每个处理程序提供 prev
和 next
字段,这些字段将引用邻居。通过向列表中添加一个新的处理程序,我使用相应的引用来初始化这些字段。现在我可以在所有处理程序的方法中使用这些引用。 (这在 C++ 中使用指针很容易)。
问题是:只允许一个所有者(即具有修改权限)。那个所有者(所有处理程序的)已经是一个 XPipeline
对象。我该如何解决?也许,通过雇用:
handlers: Rc<RefCell<LinkedList<XHandler>>>
但具体如何呢?
Rust 中针对数据结构中多个链接的策略之一是使用 Vec<T>
作为后备存储,然后使用 usize
"pointers".[=14 对其进行索引=]
您的情况类似于:
struct XPipeline {
head: usize,
storage: Vec<Node>,
}
struct Node {
handler: XHandler,
next: Option<usize>,
prev: Option<usize>,
}
簿记与您在 C++ 中使用的指针非常相似。
另请参阅 this discussion on Reddit 以了解在类图结构中处理所有权的方法。
我也会寻找实现双链表、跳跃列表、图表或类似内容的 crate,并从中获取灵感。