我正在尝试创建一个简单的简单链接列表 type 类,其中我有一个指向下一个节点的指针,但遇到了一些问题。这样做的正确方法是什么?
我现在拥有的是:
trait Base {
fn connect<'a, 'b>(&'a self, next: &'b Base);
}
struct MyStruct<'b> {
next: Option<&'b Base>, // This should be swapped out with a reference to Base for the next node
}
impl<a', b'> Base for MyStruct<'b> {
pub fn new() -> MyStruct<'b'> {
MyStruct { next: None, }
}
pub fn connect<'a, 'b>(&'a self, layer: &'b Base) {
self.next = Some(layer);
}
}
我想象的方式是连接的struct / node的生命周期应该与初始节点相同(即当我解除分配列表它应该完全这样做)所以它应该有一个生命周期。但是,我相信当连接函数中存在自指针时,这会导致问题。
答案 0 :(得分:4)
你说
我有一个指向下一个节点的指针
你的代码显示引用,而不是指针,所以我认为你的意思是引用。但你也说
当我取消分配列表时,它应该完全这样做
这两个概念不兼容。唯一可以删除项目的是拥有项目。这是通过放弃所有权而没有其他任何东西来完成的。有了参考,你不拥有任何东西,你只是借用它。
现在,您可以拥有拥有指针到下一个项目。这是一个Box
,表示堆分配的项目。然后没有生命时间需要发挥作用,并在this answer中进行了介绍。
这种类型的列表是通用的,因此您可以存储像String
这样的拥有项,或者像&u32
这样的引用。删除列表或列表节点后,String
也将被删除。技术上删除了引用,但删除引用不删除引用项。
创建一个仅包含对下一个节点的引用的链接列表......至少可以说是棘手的,可能没用。
您的Node
看起来像这样:
struct Node<'a> {
next: Option<&'a mut Node<'a>>,
}
您必须自己声明并分配每个Node
,因为您无法将Node
存储在假设内的#{1}}内。 ;添加&#34;方法
对于下一个节点的引用和下一个节点的生命周期,您总是会遇到重叠生命周期的问题(对列表应用归纳并且它变得非常复杂。)
TL; DR 目前尚不清楚为什么想要这样做,但基本上不容易做到(或者值得,我的意见)。