gpt4 book ai didi

struct - 如何存储和使用接受引用并返回 future 的可选闭包?

转载 作者:行者123 更新时间:2023-12-03 11:45:11 24 4
gpt4 key购买 nike

我有一个异步函数save,它具有Save结构作为自变量,可以选择包含一个异步函数(validator)。问题在于,以下代码仅在指定了Some(..)时才有效,而使用None时,编译器将引发错误。

use std::future::Future;

trait SomeTrait {}

enum SomeError {}

#[derive(Debug)]
struct User {}

impl SomeTrait for User {}

struct Save<T, F>
where
T: SomeTrait,
F: Future<Output = Result<(), SomeError>>,
{
pub validator: Option<Box<dyn Fn(&T) -> F>>,
}

async fn save<T, F>(obj: &T, args: Save<T, F>) -> Result<(), SomeError>
where
T: SomeTrait,
F: Future<Output = Result<(), SomeError>>,
{
if let Some(v) = args.validator {
(*v)(obj).await?;
}
Ok(())
}

#[tokio::test]
async fn test_func() {
let user = User {};

save(&user, Save { validator: None }).await;
save(
&user,
Save {
validator: Some(Box::new(|obj| async {
println!("input: {:?}", obj);
Ok(())
})),
},
)
.await;
}
错误:
error[E0698]: type inside `async` block must be known in this context
--> test_utils/src/testin.rs:35:17
|
35 | save(&user, Save { validator: None }).await;
| ^^^^ cannot infer type for type parameter `F` declared on the struct `Save`
|
note: the type is part of the `async` block because of this `await`
--> test_utils/src/testin.rs:35:5
|
35 | save(&user, Save { validator: None }).await;
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
如何使上面的代码起作用?有没有在 F结构中不使用 Save泛型参数的替代实现?我现在可以使用它,但是当 Save结构中有多个函数时,可能会变得笨拙。

最佳答案

使用BoxFuture由于要隐藏类型,因此使用trait对象很有用。 BoxFuture非常适合此操作,结合boxed方法创建它:

use futures::{future::BoxFuture, FutureExt};
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;
也可以看看:
  • How can one await a result of a boxed future?
  • Cannot use `impl Future` to store async function in a vector
  • How do I erase the type of future in the new future API?

  • 将None与泛型类型一起使用
    这里的问题是,即使您因为选择了 None而没有使用泛型类型,也必须知道该泛型类型。您可以提供适合约束的类型(实现 FutureOutputResult<(), SomeError>)。在这里我使用 Ready :
    type Dummy = futures::future::Ready<Result<(), SomeError>>;

    save::<_, Dummy>(&user, Save { validator: None }).await;
    不幸的是,这产生了一个我尚不知道如何解决的错误(“借来的数据不能存储在其关闭的外部”)。
    也可以看看:
  • Create a generic struct with Option<T> without specifying T when instantiating with None
  • Pass None into a function that accepts Option
  • Is there a way to hint to the compiler to use some kind of default generic type when using Option::None?
  • 关于struct - 如何存储和使用接受引用并返回 future 的可选闭包?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62773412/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com