考虑以下返回异步块的闭包:
|entity: &mut Entity| async move {
entity.foo().await;
}
是否可以在枚举中键入Erase并存储该闭包,而不指定该枚举的泛型类型或生存期?请考虑以下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 */)
}
我try 了几种不同的方法,但似乎即使我将所有东西都放在盒装的特征对象之后,我也无法阻止这个泛型生存期'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>
}