首页 > 解决方案 > 如何返回捕获参数的过滤迭代器?

问题描述

我正在尝试创建一个基于参数过滤切片的迭代器。

fn dates_from_iterator_ref<'a>(
    from: &'a NaiveDate,
    dates: &'a [NaiveDate],
) -> impl Iterator<Item = &'a NaiveDate> {
    dates.iter().filter(|&date| date >= from)
}

fn dates_from_iterator_val<'a>(
    from: NaiveDate,
    dates: &'a [NaiveDate],
) -> impl Iterator<Item = &'a NaiveDate> {
    dates.iter().filter(|&&date| date >= from)
}

无论我将参数作为引用还是值传递,我都会得到相同的错误:

   |
89 | fn dates_from_iterator_ref<'a>(
   |                            -- lifetime `'a` defined here
...
92 | ) -> impl Iterator<Item = &'a NaiveDate> {
   |      ----------------------------------- opaque type requires that `from` is borrowed for `'a`
93 |     dates.iter().filter(|&date| date >= from)
   |                         -------         ^^^^ borrowed value does not live long enough
   |                         |
   |                         value captured here
94 | }
   | - `from` dropped here while still borrowed

我怎样才能让它工作?

标签: rustiteratorclosures

解决方案


对于值版本,您只需要通过将值移动到捕获中来确保闭包捕获值date,而不是通过添加move关键字来借用它。

此外,正如@LukasKalbertodt 所指出的,您应该将闭包从更改|&&date| date >= from|&date| date >= &from

pub fn dates_from_iterator_val<'a>(
    from: NaiveDate,
    dates: &'a [NaiveDate],
) -> impl Iterator<Item = &'a NaiveDate> {
    dates.iter().filter(move |&date| date >= &from)
}

对于 ref 版本,同样适用,但移动的是引用而不是值:

pub fn dates_from_iterator_ref<'a>(
    from: &'a NaiveDate,
    dates: &'a [NaiveDate],
) -> impl Iterator<Item = &'a NaiveDate> {
    dates.iter().filter(move |&date| date >= from)
}

推荐阅读