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

2024-02-02

当搜索有关的文档时保守的隐含特质, 我找到了这个例子 https://github.com/rust-lang/rust/issues/43719:

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)
    }
}

一生有什么作用'a意思是返回类型?

我知道这个关于生命周期的问题Box https://stackoverflow.com/questions/42028470/why-is-adding-a-lifetime-to-a-trait-with-the-plus-operator-iteratoritem-foo,但我认为用例是不同的。如果我理解得很好的话,答案是:

Trait 对象仅在生命周期 'a 内有效

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

但在这里,这不是一个特征对象,而是一个存在于堆栈中的具体对象。所以编译器不需要有关于它的生命周期的提示。

我对此缺少什么?


语法impl Iterator<Item = u32> + 'a means

  • 将返回函数定义的某些类型,但您不知道确切的类型。这就是impl ... part.
  • 未指定的具体类型将是一个迭代器u32价值观。这就是Iterator<Item = u32> part.
  • 未指定的具体类型可能包含参考文献与一生'a。这就是+ 'a part.

在您的示例中,返回的迭代器包含对self,所以它的生存时间一定不能长于实例的寿命A,否则无效。具体类型(如果我们可以写的话)是iter::Map<slice::Iter<'a, (u32, u32)>, <closure>>- 请注意,它有一个'a in it.

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

这并不完全正确。两种情况具有相同的含义:未指定的具体类型可能包含引用。对于特征对象,具体类型位于某种类型的指针后面(Box, &, Rc, ETC。)。使用 impl 特性,具体类型直接放置在堆栈上。

这不是一个特征对象,而是一个存在于堆栈中的具体对象

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

let x: &std::fmt::Display = &42;
println!("{}", x);

也可以看看:

  • 为什么 Rust 需要明确的生命周期? https://stackoverflow.com/q/31609137/155423
  • 是否允许多态变量? https://stackoverflow.com/q/28219519/155423
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

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

随机推荐