我如何返回捕获参数的过滤迭代器?

问题描述 投票:0回答:1

我正在尝试创建一个迭代器,该迭代器根据参数过滤切片。

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

我该如何使用它?

rust iterator closures
1个回答
0
投票

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

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

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

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)
}
© www.soinside.com 2019 - 2024. All rights reserved.