为什么对特征绑定中的类型的引用需要生命周期?

Fel*_* B. 6 lifetime rust

我想我了解生命周期如何与函数参数/输出和结构一起工作,因为这些情况在书中(以及在nomicon 中进一步解释),但我不明白生命周期如何用于类型边界。例如:

trait Min<Elmt> {
    fn get_min(&self) -> Elmt;
}

impl<T, Elmt> Min<Elmt> for T
where
    &T: IntoIterator<Item = Elmt>,
    Elmt: Ord,
{
    fn get_min(&self) -> Elmt {
        let mut iter = self.into_iter();
        match iter.next() {
            None => panic!("Empty List"),
            Some(x) => iter.fold(x, |acc, y| acc.min(y)),
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

在这里,我要求类型T满足以下属性:它的任何引用都必须实现IntoIterator<Item = Ord>. 这段代码无法编译,因为 Rust 想要&T有一个生命周期,而我不知道为什么。该where子句应该只确保某些东西是某种类型,这是在编译时完成的。生命周期/引用是如何产生的?确保&T实现类型的T实现IntoIterator与悬空指针或内存泄漏无关。

来自 Rust Discord 的人帮助我完成了这个工作:

trait Min<'a, Elmt> {
    fn get_min(&'a self) -> Elmt;
}

impl<'a, T, Elmt> Min<'a, Elmt> for T
where
    &'a T: IntoIterator<Item = Elmt> + 'a,
    Elmt: Ord,
{
    fn get_min(&'a self) -> Elmt {
        let mut iter = self.into_iter();
        match iter.next() {
            None => panic!("Empty List"),
            Some(x) => iter.fold(x, |acc, y| acc.min(y)),
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

游乐场变体

他们试图向我解释,但我无法理解,所以我正在寻找另一种解释来进入我的大脑。

让我一一介绍:

  1. &'a T: IntoIterator<Item = Elmt> + 'a,我们给泛型引用&T一个生命周期'a。为什么需要这个?
  2. 为什么我们要限制&'a T到生命周期'a?我的意思是这不是同义反复吗?

    由于我们在where子句中使用了生命周期,因此我们必须将其添加到某个签名中。那是impl<'a, T, Elmt>从哪里来的 - 很好

  3. 为什么特征Minget_min()函数现在需要生命周期参数?生命周期省略应该给每个输入元素一个生命周期,而输出无论如何都没有生命周期。

我想,如果我知道什么样的特征可能帮助/他们是如何实现的。对象基本上是变量和方法指针的列表。特征中的方法是否简单地附加到每个实现对象的方法指针?它们是否以某种方式分离对象?他们真的有一辈子吗?哪辈子?我从不Min使用let a = Trait::new()语法分配“一般特征” ,那么它怎么会有生命周期呢?


解决for<>-implementation 注释:

虽然 trait 和实现将在for<'a>生命周期绑定的情况下编译&T,但结果不可用。由于&Vec显然不满足特征界限(参见这个操场)。这也在 Discord 讨论中提出,我也不了解for<>语法,但我认为这可能超出了这个问题的范围。

归档时间:

查看次数:

118 次

最近记录:

5 年,6 月 前