- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个函数,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
最佳答案
除非您的变量像 Rc
一样可共享,否则这是不可能的。或 Arc
, 自 FnMut
可以多次调用您的闭包可能需要返回多个捕获的变量。但是在返回后,你失去了变量的所有权,所以你不能把它返回,由于安全性,Rust 不允许你这样做。
根据您的逻辑,我们知道一旦您的Future
准备好了就不需要再次轮询了,所以我们可以不使用智能指针来创建解决方案。让我们考虑一个像下面这样的容器对象,我使用了 Option
:
use futures::sync::mpsc;
use futures::{Future, Async, try_ready};
use futures::stream::Stream;
use core::mem;
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();
let mut rx = Some(rx); //wrapped with an Option
futures::future::poll_fn(move || {
while events.len() < n {
let e = try_ready!(rx.as_mut().unwrap().poll()).unwrap();//used over an Option
events.push(e);
}
let ret = mem::replace(&mut events, Vec::new());
//We took it from option and returned.
//Careful this will panic if the return line got execute more than once.
Ok(Async::Ready((rx.take().unwrap(), ret)))
})
.fuse()
}
fuse()
确保在返回
Async::Ready
后不会再次调用闭包,否则它会为进一步的民意调查而 panic 。
std::mem::swap
:
futures::future::poll_fn(move || {
while events.len() < n {
let e = try_ready!(rx.poll()).unwrap();
events.push(e);
}
let mut place_holder_receiver = futures::sync::mpsc::channel(0).1; //creating object with same type to swap with actual one.
let ret = mem::replace(&mut events, Vec::new());
mem::swap(&mut place_holder_receiver, &mut rx); //Swapping the actual receiver with the placeholder
Ok(Async::Ready((place_holder_receiver, ret))) //so we can return placeholder in here
})
.fuse()
receiver
与
place_holder_receiver
.由于占位符是在
FnMut
中创建的(
未捕获 )我们可以根据需要多次返回它,因此编译器再次感到高兴。感谢
fuse()
返回成功后不会调用这个闭包,否则会返回
Receiver
s 带有一个丢弃的
Sender
.
关于rust - 如何从 `FnMut` 闭包中返回捕获的变量,同时也是一个捕获者,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60645623/
给定一个 Rc ,在迭代器上映射时如何使用它?例如: use std::rc::Rc; fn main() { let f = Rc::new(|x| x); let v = vec!
use std::cell::RefCell; use std::rc::Rc; use wasm_bindgen::prelude::*; use wasm_bindgen::JsCast; fn
我有第三方库,代码如下: pub struct Foo { t: T } impl Foo where T: 'a + FnMut() -> &'a [u8] { pub fn from_ca
我正在尝试拥有一组可以采用 CharPredicate 的函数这是我自己的特征,通过 FnMut(char) -> bool 实现, Range , char等 目标是能够像这样调用助手: scan_
我有以下代码: struct Callable { callable: Box, } struct Parameters { text: &'a str, } struct Conte
这是一个可以组合Fn 闭包的compose 函数: fn compose(f: F1, g: F2) -> Box T3 + 'a> where F1: Fn(T1) -> T2 + 'a,
我正在为 Rust 编写一个 Phoenix 客户端库,利用来自 rust-websockets 的异步 websocket 客户端.现在我无法弄清楚如何将回调函数传递到处理 websocket 流量
pub fn create_future( notificator: mpsc::Sender, proxy: Proxy, ) -> impl Future { proxy.
背景:我试图避免使用 Mutex/RefCell/Option在嵌入式系统的中断处理程序中跳舞。我不想使用堆(而且我不认为它应该是必要的——但随时告诉我错误)。我不能使用 std .我看过 corte
如何在需要 FnMut 类型的上下文中使用盒装闭包,例如 pub fn main() { for n in (0..10).map(Box::new(|i| i * 2)) { print
我有一个类似这样的struct: struct Foo { callbacks: Vec, } 我想调用每个回调,但我的尝试不起作用: fn foo(&mut self) { for
这是来自 Rust by Example 的示例: pub trait Iterator { // The type being iterated over. type Item;
我正在尝试返回一个以 &Any 作为参数的闭包。以下代码返回编译器错误。 trait Selector { fn id(&self) -> i64; fn selector(&self
我想使用 FnMut(&[f32]) -> f32,为了不复制/粘贴完整签名,我想引入某种别名,但是 type Boo = FnMut(&[f32]) -> f32; fn f(mut f: F) {
自从 Iter's "all" fn takes type FnMut是否可以在检查条件和短路时更新元素?虽然我知道它不应该这样做,但是是什么阻止它更新值? fn main() { let a
我有以下代码片段,它实现了某种发射器结构: type Callback = Option; struct Emitter { cb: Callback } impl Emitter { fn
我已经通用实现了callback_list_stream,但是我似乎无法以专门的方式使用它。如果我按照T复制/粘贴代码,则该代码有效。 use futures::channel::mpsc::Rece
我有一个函数,collect_n ,返回 Future反复polls一个 futures::sync::mpsc::Receiver并将结果收集到一个向量中,并使用该向量进行解析。问题是它消耗了 Re
我正在尝试创建一个简单的程序,其中包含一个包含逐渐清空自身的集合的闭包: fn main() { let vector = vec![1, 2, 3]; let mut allow_o
基本上,我想编写一个返回闭包的函数。我怎样才能做到这一点而不必返回 Box ? 来自closures chapter of the rust book ,我读到闭包只是结构的语法糖和 FnOnce 的
我是一名优秀的程序员,十分优秀!