返回保守的impl特征时,生命周期意味着什么?

Fre*_*ios 7 generics lifetime rust

在搜索有关保守impl trait的文档时,我发现了这个例子:

struct A {
    x: [(u32, u32); 10]
}

impl A {
    fn iter_values<'a>(&'a self) -> impl 'a + Iterator<Item = u32> {
        self.x.iter().map(|a| a.0)
    }
}
Run Code Online (Sandbox Code Playgroud)

生命周期'a在返回类型中意味着什么?

我知道关于终身受限Box这个问题,但我认为用例是不同的.如果我理解答案:

特质对象仅对生命周期'a有效

这意味着生活在堆中某处的特征对象将在一生中持续'a.

但在这里,这不是一个特质对象,而是一个生活在堆栈中的具体对象.因此编译器不需要提供有关其生命周期的提示.

我对此缺少什么?

She*_*ter 11

语法impl Iterator<Item = u32> + 'a意味着

  • 函数定义的某些类型将被返回,但您不知道确切的类型.那是impl ...一部分.
  • 未指定的具体类型将是u32值的迭代器.那是Iterator<Item = u32>一部分.
  • 未指定的具体类型可能包含生命周期的引用'a.那是+ 'a一部分.

在您的示例中,返回的迭代器包含对引用的引用self,因此不能允许它比实例更长寿A,否则它将无效.具体类型(如果我们可以写的话)将是iter::Map<slice::Iter<'a, (u32, u32)>, <closure>>- 注意它有一个'a.

这意味着生活在堆中某处的特征对象将在一生中持续'a.

这不是真的.两种情况都具有相同的含义:未指定的具体类型可能包含引用.与性状对象,具体类型是某种(的指针背后Box,&,Rc等等).使用impl trait,具体类型直接放在堆栈上.

这不是特征对象,而是生活在堆栈中的具体对象

特征对象不需要堆; 他们只能利用堆栈:

let x: &std::fmt::Display = &42;
println!("{}", x);
Run Code Online (Sandbox Code Playgroud)

也可以看看:

  • _"可能包含带有生命周期'的引用"_ - 有趣的是你用这种方式表达了它.完全相同,但我对其意义的直觉是相反的:"一定不能超过一生". (3认同)