【发布时间】:2022-02-06 03:06:30
【问题描述】:
Playground如果你想直接跳转到代码中。
问题
我正在尝试实现一个函数filter_con<T, F>(v: Vec<T>, predicate: F),它允许通过async 谓词对Vec 进行并发过滤。
也就是说,而不是做:
let arr = vec![...];
let arr_filtered = join_all(arr.into_iter().map(|it| async move {
if some_getter(&it).await > some_value {
Some(it)
} else {
None
}
}))
.await
.into_iter()
.filter_map(|it| it)
.collect::<Vec<T>>()
每次我需要过滤Vec 时,我都希望能够:
let arr = vec![...];
let arr_filtered = filter_con(arr, |it| async move {
some_getter(&it).await > some_value
}).await
暂定实施
我已将函数提取到它自己的函数中,但我遇到了生命周期问题
async fn filter_con<T, B, F>(arr: Vec<T>, predicate: F) -> Vec<T>
where
F: FnMut(&T) -> B,
B: futures::Future<Output = bool>,
{
join_all(arr.into_iter().map(|it| async move {
if predicate(&it).await {
Some(it)
} else {
None
}
}))
.await
.into_iter()
.filter_map(|p| p)
.collect::<Vec<_>>()
}
error[E0507]: cannot move out of a shared reference
我不知道我要从谓词中移出什么?
更多详情,请参阅playground。
【问题讨论】:
-
好的,所以我认为 FnMut 是
map()参数。不知道我们是否可以转换它,因为我们在这里没有修改任何东西...... -
在 Discord 上讨论后,here's as close as I can get。我相信剩余的错误是可以解决的,但我目前没有看到矩阵。
标签: rust async-await