Struct 如何存储和使用接受引用并返回未来的可选闭包?
我有一个异步函数Struct 如何存储和使用接受引用并返回未来的可选闭包?,struct,rust,async-await,closures,Struct,Rust,Async Await,Closures,我有一个异步函数save,它有一个savestruct-as参数,可选地包含一个异步函数(validator)。问题是,以下代码仅在指定了Some(…)时有效,而None编译器会抛出错误 使用std::future::future; trait SomeTrait{} 枚举某些错误{} #[导出(调试)] 结构用户{} 用户{}的impl SomeTrait 结构保存 哪里 T:某种特质, F:未来, { 发布验证程序:选项>, } 异步fn保存(对象:&T,参数:保存)->结果 哪里 T:某种
save
,它有一个save
struct-as参数,可选地包含一个异步函数(validator
)。问题是,以下代码仅在指定了Some(…)
时有效,而None
编译器会抛出错误
使用std::future::future;
trait SomeTrait{}
枚举某些错误{}
#[导出(调试)]
结构用户{}
用户{}的impl SomeTrait
结构保存
哪里
T:某种特质,
F:未来,
{
发布验证程序:选项>,
}
异步fn保存(对象:&T,参数:保存)->结果
哪里
T:某种特质,
F:未来,
{
如果让一些(v)=args.validator{
(*v)(obj).等待?;
}
好(())
}
#[东京:测试]
异步fn测试函数(){
让user=user{};
保存(&user,保存{validator:None});
拯救(
&用户,
拯救{
验证器:一些(Box::new(| obj | async){
println!(“输入:{:?}”,obj);
好(())
})),
},
)
.等待;
}
错误:
error[E0698]:在此上下文中必须知道'async'块内的类型
-->测试用例/src/testin.rs:35:17
|
35 | save(&user,save{validator:None});
|^^^^^无法推断在结构“Save”上声明的类型参数“F”的类型`
|
注意:该类型是'async'块的一部分,因为该'wait'`
-->测试用例/src/testin.rs:35:5
|
35 | save(&user,save{validator:None});
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
我如何才能使上述代码工作?在Save
struct中是否有不使用F
generic参数的替代实现?我现在可以使用它,但是当保存
结构中有多个函数时,使用框future
由于要隐藏类型,因此使用trait对象非常有用BoxFuture
非常适合于此,与boxed
方法相结合创建:
use futures::{future::BoxFuture, FutureExt};
另见:
None
。您可以提供符合约束的类型(实现未来
,输出
是一个结果
)。我在这里使用:
type Dummy=futures::future::Ready;
保存::(&user,保存{validator:None})。等待;
不幸的是,这产生了一个我还不知道如何解决的错误(“借用的数据不能存储在其闭包之外”)
另见:
None
时才会出现问题。
struct Save<T>
where
T: SomeTrait,
{
pub validator: Option<Box<dyn Fn(&T) -> BoxFuture<Result<(), SomeError>>>>,
}
let _ = save(
&user,
Save {
validator: Some(Box::new(|obj| {
async move {
println!("input: {:?}", obj);
Ok(())
}
.boxed()
})),
},
)
.await;
type Dummy = futures::future::Ready<Result<(), SomeError>>;
save::<_, Dummy>(&user, Save { validator: None }).await;