有哪些实际的例子,展示了具有多个生命周期参数的结构体?

3
我对Rust还不熟悉,但我认为我已经足够理解生命周期参数的概念了。我可以看出这在方法中将多个参数作为引用传递时非常有用。然而,我想不出一个例子,当一个结构体保存对具有不同生命周期的两个不同变量的引用时。Rust book没有提供具有多个生命周期的结构体的示例。 Elision 2.0讨论了“只有一个生命周期参数的结构体”,并专注于使处理只有一个生命周期参数的类型更容易,这表明这是生命周期最常见的用例-要么结构体没有生命周期,要么它只有一个寿命。 谁能给我提供一个具有多个生命周期参数的实际示例?

你可以在昨天的回答中找到一个例子:https://dev59.com/OLbna4cB1Zd3GeqPbXhs#58050166 - Denys Séguret
拥有一个生命周期的原因可能只是发生了多次。另一个例子,有3个生命周期:https://github.com/Canop/termimad/blob/master/src/displayable_line.rs#L11 - Denys Séguret
越多的引用,就有越多的生命周期:这就是全部。 - Boiethios
1
感谢Denys - 如果您愿意,您可以将其发布为答案,因为这些示例绝对回答了我的问题。第一个示例是引用另一个引用,这可能是非常常见的情况。到目前为止,我只从Rust playground中使用Rust,因此我没有编写过非常复杂的代码,并且没有必要使用具有多个生命周期的类。 - Andrew Williamson
1个回答

2
当你在结构体中使用引用时,需要使用生命周期。有时你可以为结构体的各个引用使用相同的生命周期,但并不总是这样。生命周期是一个值存在期间(创建和删除之间)的引用。它是借用检查器将检查的约束条件。如果你给两个字段使用相同的生命周期,会添加一个通常无法验证的约束条件,从而限制了你的结构体可能的使用方式。以下是一个真实世界的例子
pub struct DisplayableLine<'s, 'l, 'p> {
    pub skin: &'s MadSkin,
    pub line: &'p FmtLine<'l>,
    pub width: Option<usize>, // available width
}

这个结构体本身通常存在的时间很短。皮肤和线条来自不同的来源。你可以有一个仅用于显示并希望立即删除的皮肤,或者在保留皮肤的同时制作一条线。为两个字段赋予相同的生命周期比必要限制更大。

当您的结构体总是引用一起创建和删除的值时,具有两个生命周期是不必要的。但在实践中,这种情况很少见。


我认为“荒谬”可能有些言过其实。也许你可以举个例子,说明将两个字段的生命周期绑定在同一时间上会有什么限制?具有更长生命周期的引用是具有较短生命周期的引用的子类型,因此在结构体中两次使用相同的生命周期通常不是一个大问题,因为结构体本身无法超出较短生命周期的范围。 - Peter Hall
1
@PeterHall 大多数示例都来自于现实世界的复杂性,当一个结构体的两个字段必须在简单情况下具有不同的生命周期时,很难想出一个小而明显的示例。 这里是一个。无论如何我都会删除“非常”这个词。 - Denys Séguret
@DenysSéguret,我注意到在你的游乐场示例中,lg函数的第二个生命周期参数可以被删除(但对于BiRef仍需要两个)。是否存在一种情况,一个函数需要多个生命周期参数? - Steven Shaw

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接