链表中“下一个”指针的惯用寿命是多少?

时间:2015-07-21 19:18:16

标签: linked-list rust

我正在尝试创建一个简单的简单链接列表 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的生命周期应该与初始节点相同(即当我解除分配列表它应该完全这样做)所以它应该有一个生命周期。但是,我相信当连接函数中存在自指针时,这会导致问题。

1 个答案:

答案 0 :(得分:4)

你说

  

我有一个指向下一个节点的指针

你的代码显示引用,而不是指针,所以我认为你的意思是引用。但你也说

  

当我取消分配列表时,它应该完全这样做

这两个概念不兼容。唯一可以删除项目的是拥有项目。这是通过放弃所有权而没有其他任何东西来完成的。有了参考,你不拥有任何东西,你只是借用它。

现在,您可以拥有拥有指针到下一个项目。这是一个Box,表示堆分配的项目。然后没有生命时间需要发挥作用,并在this answer中进行了介绍。

这种类型的列表是通用的,因此您可以存储像String这样的拥有项,或者像&u32这样的引用。删除列表或列表节点后,String也将被删除。技术上删除了引用,但删除引用删除引用项。

创建一个仅包含对下一个节点的引用的链接列表......至少可以说是棘手的,可能没用。

您的Node看起来像这样:

struct Node<'a> {
    next: Option<&'a mut Node<'a>>,
}

您必须自己声明并分配每个Node,因为您无法将Node存储在假设内的#{1}}内。 ;添加&#34;方法

对于下一个节点的引用和下一个节点的生命周期,您总是会遇到重叠生命周期的问题(对列表应用归纳并且它变得非常复杂。)

TL; DR 目前尚不清楚为什么想要这样做,但基本上不容易做到(或者值得,我的意见)。