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 这里的问题是泛型类型必须是已知的,即使您没有使用它,因为您选择了
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;