我正在尝试创建一个迭代器,该迭代器根据参数过滤切片。
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
我该如何使用它?
对于值版本,您只需要确保闭包通过将值移到捕获中来捕获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)
}