【发布时间】:2020-03-11 23:18:27
【问题描述】:
我有一个函数collect_n,它返回一个Future,它重复polls和futures::sync::mpsc::Receiver,并将结果收集到一个向量中,并使用该向量进行解析。问题是它消耗了Receiver,所以Receiver 不能再次使用。我正在尝试编写一个拥有Receiver 所有权的版本,然后在返回的Future 解析时将所有权返回给调用者。
这是我写的:
/// Like collect_n but returns the mpsc::Receiver it consumes so it can be reused.
pub fn collect_n_reusable<T>(
mut rx: mpsc::Receiver<T>,
n: usize,
) -> impl Future<Item = (mpsc::Receiver<T>, Vec<T>), Error = ()> {
let mut events = Vec::new();
future::poll_fn(move || {
while events.len() < n {
let e = try_ready!(rx.poll()).unwrap();
events.push(e);
}
let ret = mem::replace(&mut events, Vec::new());
Ok(Async::Ready((rx, ret)))
})
}
这会导致编译错误:
error[E0507]: cannot move out of `rx`, a captured variable in an `FnMut` closure
--> src/test_util.rs:200:26
|
189 | mut rx: mpsc::Receiver<T>,
| ------ captured outer variable
...
200 | Ok(Async::Ready((rx, ret)))
| ^^ move occurs because `rx` has type `futures::sync::mpsc::Receiver<T>`, which does not implement the `Copy` trait
我怎样才能完成我想做的事情?
【问题讨论】: