"将特质绑定在其自身的泛型生命周期上(trait Bar<'a>: 'a)"的意思是什么?

4

我在官方文档中看到了这种类型的代码:

trait Bar<'a>: 'a { }

我没有考虑过这种情况。

我直觉地将类型的“lifetime bound”解释为:

some_reference: &'a Some_Type = &instance_of_Some_Type;
T: 'a // T is borrowed by "instance_of_Some_Type"

“trait Bar<'a>: 'a { }”的意思是什么?它有一个使用参数来借用类型的方法吗?

它和这个是否相同?

impl Bar<'a> for Another_Type
where
    Another_Type: 'a
{
}

我想不出以上含义的用途,这种情况的示例用法是什么?我很难理解“trait 的生命周期参数”的含义。

1个回答

2

一个特质的生命周期绑定是关于某个实现该特质的类型内部的引用。

例如,对于一个特质的'static生命周期绑定意味着它不能被包含有不比'static更长寿的引用的结构体所实现。

让我们看一下没有生命周期绑定的示例:

trait Bar<'a> { }

这是一个基于生命周期 'a 的参数化特质,但并不要求这个实现实际上比 'a 活得更长,因此我们可以这样做:
struct HasRef<'b>(&'b i32);
impl Bar<'static> for HasRef<'_> { }

这段文字表明,即使一个HasRef结构体的生命周期很短,它仍然实现了Bar<'static>特质。

改写为:

trait Bar<'a>: 'a { }

说任何实现 Bar<'a> 的类型必须至少与 'a 一样长,这可能更有意义。

(这些限制对于特质对象(类型为 dyn Trait)尤其重要,因为只有特质本身才能告诉编译器该特质对象内部引用的生命周期。)


啊哈。通过将生命周期限制直接实现到Trait中,我可以省略对dyn Trait的生命周期限制!谢谢。 - kwonryul
然而,对我来说这还是相当模糊的。(一堆有关生命周期的东西……) - kwonryul

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