提问人:mallwright 提问时间:6/29/2023 更新时间:6/29/2023 访问量:48
类型擦除返回异步块的闭包
Type erasure of a closure that returns an async block
问:
请考虑以下返回异步块的闭包:
|entity: &mut Entity| async move {
entity.foo().await;
}
是否可以在不指定该枚举的泛型类型或生存期的情况下键入擦除并将此闭包存储在枚举中?考虑以下 MWE:
use std::future::Future;
struct Entity;
impl Entity {
async fn foo(&mut self) {}
}
fn main() {
erase_and_store(|entity: &mut Entity| async move {
entity.foo().await;
});
}
fn erase_and_store<'a, C, F>(closure: C) -> Task where
C: FnOnce(&'a mut Entity) -> F,
F: Future<Output = ()> + 'a {
Task::Variant(/* TODO convert closure to something that can be stored */)
}
enum Task {
Variant(/* TODO store closure */)
}
我尝试了几种不同的方法,但似乎即使我把所有东西都放在盒装特征对象后面,我也无法阻止这个通用生命周期泄漏到我的枚举中。'a
Task
type AnyFuture<'a> = Box<dyn Future<Output = ()> + 'a>;
type AnyClosure<'a> = Box<dyn FnOnce(&'a mut Entity) -> AnyFuture<'a>>;
enum Task {
Variant(AnyClosure) // requires <'a>
}
答:
3赞
Chayim Friedman
6/29/2023
#1
你想要的是更高等级的生命周期:
type AnyFuture<'a> = Pin<Box<dyn Future<Output = ()> + 'a>>;
type AnyClosure = Box<dyn for<'a> FnOnce(&'a mut Entity) -> AnyFuture<'a>>;
可以省略:
type AnyFuture<'a> = Pin<Box<dyn Future<Output = ()> + 'a>>;
type AnyClosure = Box<dyn FnOnce(&mut Entity) -> AnyFuture<'_>>;
评论
Box
Box
entity.foo
entity
erase_and_store
Box
Future
impl Trait
Task
Task