rust - 如何返回捕获参数的过滤迭代器?
问题描述
我正在尝试创建一个基于参数过滤切片的迭代器。
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
关键字来借用它。
此外,正如@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)
}
推荐阅读
- c - 在 C 中为函数设置值
- android - 关闭蓝牙适配器不调用 onConnectionStateChange Android 8.1.0
- excel - 如何比较“mm:ss”1 英里的运行时间以确定哪个更快
- java - 将字符串时间转换为本地时间以进行比较
- c - 遍历双向链表会永远运行(尽管有明显的 NULL 终止符)
- python - 什么数据结构允许多键访问,甚至是其他键?
- node.js - sequelize 中的 DataType 有什么作用?为什么在参数中传递它并在没有定义它的情况下运行?
- flutter - 如何在脚手架小部件的 AppBar 下方而不是下方显示正文?
- c++ - 在单臂霓虹灯寄存器中有效地将 8 位数字扩展到 12 位
- react-native - React Native 安装对我不起作用