繁体   English   中英

为什么使用加号运算符(Iterator<Item = &Foo> + &#39;a) 需要吗?

[英]Why is adding a lifetime to a trait with the plus operator (Iterator<Item = &Foo> + 'a) needed?

我在迭代器上应用了一个闭包,我想使用稳定的,所以我想返回一个装箱的Iterator 这样做的明显方法如下:

struct Foo;

fn into_iterator(myvec: &Vec<Foo>) -> Box<dyn Iterator<Item = &Foo>> {
    Box::new(myvec.iter())
}

这会失败,因为借用检查器无法推断适当的生命周期。

经过一些研究,我发现返回迭代器(或任何其他特征)的正确方法是什么? ,这让我添加了+ 'a

fn into_iterator<'a>(myvec: &'a Vec<Foo>) -> Box<dyn Iterator<Item = &'a Foo> + 'a> {
    Box::new(myvec.iter())
}

但我不明白

  • 这是做什么的
  • 为什么这里需要它

有一件事很容易被忽视:如果你有一个 trait Bar并且你想要一个装箱的 trait 对象Box<dyn Bar> ,编译器会自动添加一个'static生命周期绑定”(如RFC 599 中所指定)。 这意味着Box<dyn Bar>Box<dyn Bar + 'static>是等价的!

在您的情况下,编译器会自动添加静态边界,以便 ...

fn into_iterator(myvec: &Vec<Foo>) -> Box<dyn Iterator<Item = &Foo>>

...相当于:

fn into_iterator(myvec: &Vec<Foo>) -> Box<dyn Iterator<Item = &Foo> + 'static>

现在生命周期省略规则开始并“连接”两个生命周期槽,这样上面的代码就相当于:

fn into_iterator<'a>(myvec: &'a Vec<Foo>) -> Box<dyn Iterator<Item = &'a Foo> + 'static>

但是类型Iter<'a, Foo>Vec<Foo>的特定迭代器类型)显然不满足绑定'static (因为它借用了Vec<Foo> )! 所以我们必须通过指定我们自己的生命周期边界来告诉编译器我们不想要默认的'static边界”:

fn into_iterator<'a>(myvec: &'a Vec<Foo>) -> Box<dyn Iterator<Item = &Foo> + 'a>

现在编译器知道 trait 对象只对生命周期'a有效。 请注意,我们不需要明确注释关联Item类型的生命周期! 终生省略规则会解决这个问题。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM