如何将异步函数存储在结构中并从结构实例调用它?

2024-04-26

我正在尝试用新的方法来实现这一目标async/await句法,std::future::Futures 和最新版本的 Tokio。我正在使用东京0.2.0-alpha.4和铁锈1.39.0-nightly.

我尝试过的不同事情包括:

  • using Box<dyn>s 代表我想要存储在结构中的类型
  • 在结构体定义中使用泛型

我无法完全获得最小的工作版本,所以这是我想要实现的简化版本:

async fn foo(x: u8) -> u8 {
    2 * x
}

// type StorableAsyncFn = Fn(u8) -> dyn Future<Output = u8>;

struct S {
    f: StorableAsyncFn,
}

#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error + Send + Sync>> {
    let s = S { f: foo };

    let out = (s.f)(1).await;

    Ok(())
}

当然,这段代码无法编译,并出现以下错误:

error[E0412]: cannot find type `StorableAsyncFn` in this scope

StorableAsyncFn此处未定义,这是我要定义的类型。


让我们用它作为我们的最小的、可重复的示例 https://stackoverflow.com/help/minimal-reproducible-example:

async fn foo(x: u8) -> u8 {
    2 * x
}

struct S {
    foo: (),
}

async fn example() {
    let s = S { foo };
}

它产生错误:

error[E0308]: mismatched types
  --> src/main.rs:10:17
   |
10 |     let s = S { foo };
   |                 ^^^ expected (), found fn item
   |
   = note: expected type `()`
              found type `fn(u8) -> impl std::future::Future {foo}`

的类型foo是一个函数指针,它接受一个u8并返回一些实现该特征的类型std::future::Future. async fn实际上只是转换的语法糖-> Foo into -> impl Future<Output = Foo>.

我们使我们的结构通用,并在匹配的通用上放置一个特征绑定。在实际代码中,您可能希望对Output关联类型,但本示例不需要它。然后我们可以像任何其他可调用成员字段一样调用该函数:

async fn foo(x: u8) -> u8 {
    2 * x
}

struct S<F>
where
    F: std::future::Future,
{
    foo: fn(u8) -> F,
}

impl<F> S<F>
where
    F: std::future::Future,
{
    async fn do_thing(self) {
        (self.foo)(42).await;
    }
}

async fn example() {
    let s = S { foo };
    s.do_thing().await;
}

为了更加灵活,您可以使用另一个泛型来存储闭包,而不是仅强制使用函数指针:

struct S<C, F>
where
    C: Fn(u8) -> F,
    F: std::future::Future,
{
    foo: C,
}

impl<C, F> S<C, F>
where
    C: Fn(u8) -> F,
    F: std::future::Future,
{
    async fn do_thing(self) {
        (self.foo)(42).await;
    }
}

也可以看看:

  • 如何通过成员变量调用函数? https://stackoverflow.com/q/27994509/155423
  • 如何在 Rust 的结构中存储闭包? https://stackoverflow.com/q/27831944/155423
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何将异步函数存储在结构中并从结构实例调用它? 的相关文章

随机推荐

  • 仅适用于我所在国家/地区的 Google 地图?

    如何在 Android 应用程序中使用 Google 地图 使其仅显示我的国家 地区 我的意思是 世界其他地方不会出现在应用程序中 查看其中之一迈克 威廉姆斯 http econym org uk gmap range htm很棒的 GMa
  • 请求头字段X-Requested

    我正在尝试访问谷歌云存储上的存储桶中的文件 我已经为存储桶设置了 CORS 配置 但当我通过 https 发出请求时 出现此错误 它适用于通过 http 发出的请求 XMLHttpRequest 无法加载 FILENAME 预检响应中的 A
  • 无限地重复可枚举

    是否存在无限重复可枚举的可枚举扩展方法 例如 给定一个返回的枚举 a b c 我想要一个返回无限重复序列的方法 a b c a b c a b c 这听起来有点像可观察 重复 http msdn microsoft com en us li
  • 如何像普通命令行程序一样从 shell 运行 sbt 主类?

    如何从 shell 运行 sbt 应用程序 以便我可以将我的应用程序作为普通的命令行程序运行 就像直接通过scala但不必设置巨大的类路径 我知道我能做到 echo hello sbt run main com foo MyMain3 ar
  • 当我在 Visual Studio 2017 的 C# 中调用方法时,是否有指向显式命名参数的快捷方式?

    在 C 中 我有一个带有许多参数的方法 我想使用所有命名参数调用该方法 VisualStudio 2017 中有执行此操作的快捷方式吗 我使用 EF6 并使用 SQL 2014 从具有 10 多个输入参数的存储过程生成方法 Method p
  • 如何将“&[email protected]”附加到 GoogleWebAuthorizationBroker

    我想将 login hint 附加到向 Google 发出的身份验证请求中 我正在使用以下代码 FileDataStore fDS new FileDataStore Logger Folder true GoogleClientSecre
  • 创建新的 SqlDataAdapter 时出现 C# InvalidOperationException

    我编写了一些代码来建立与 SQL Server 的连接 然后执行 select 过程以从 SQL Server 中的数据表中获取所有数据 但它在声明新的 SqlDataAdapter 的命令中抛出 InvalidOperationExcep
  • 如何使用 ASP.NET MVC 控制器操作将文件发送到浏览器?

    我有一个应用程序 允许我的用户上传任何类型的文件 我将其保存在服务器上的文件系统中 该应用程序只能由两个用户访问 因此我无需担心上传任何可疑文件 如何允许用户按下 MVC 表单上的按钮来请求通过浏览器发回文件并显示标准保存 打开对话框 我想
  • C# 如何获取 COM 接口的实例

    我做了很多谷歌搜索 试图找到获取 COM 接口实例的标准方法 微软在他们的文章中提供了一个例子COM 互操作第 1 部分 客户端教程 https msdn microsoft com en us library aa645736 v vs
  • WCF 绑定到 HTTPS

    我知道有很多关于此的帖子 并且我已经浏览了搜索中出现的所有帖子并实现了所提到的所有内容 我有一个 WCF Web 服务 可以在我的本地系统上使用 HTTP 运行 也可以在服务器上使用 HTTP 运行 但客户端要求这通过 HTTPS 进行 这
  • Oracle 中的重复行

    如何防止在选择查询中选择重复的行 我有一个包含以下字段的表 name type user1 user2 user3 date 我的查询要求我仅在用户在前端输入的时间为特定用户选择数据 假设用户输入 1 那么选择查询应仅检索 user1 的数
  • 使用 Rivets.js 迭代 Backbone.js 模型的集合?

    我在用着铆钉 js http rivetsjs com 对于 Backbone 项目中的两个双向数据绑定 并且希望实现迭代绑定 文档表明迭代绑定是可能的 但没有可用的示例 我正在使用一个简单的 Rails API 将 JSON 发送到客户端
  • 无法让 raycaster.intersectObjects() 从远处返回相交的对象

    我有一个包含几个随机数的散点图Sprite用作数据点的对象 我想检测鼠标指针 光标 和Sprite对象 我用来检测交叉点的设置如下 var projector new THREE Projector window addEventListe
  • Sitecore - 将网址中的“_”重写为“-”,但会出现 404

    我正在使用 Sitecore 7 5 并替换了两件事
  • 确定 SQL Server 表是否为只读

    确定给定 SQL Server 表是否为只读 由于帐户权限或数据库被标记为只读 的最佳方法是什么 for database updated for newer versions SELECT DATABASEPROPERTYEX DB NA
  • TestNG中BeforeTest和BeforeMethod有什么区别

    这两个注释都在 testNG 中的 test 之前运行 那么它们之间有什么区别 检查下面的代码和输出 import org testng annotations BeforeMethod import org testng annotati
  • -bash:!/usr/bin/env:未找到事件[重复]

    这个问题在这里已经有答案了 我在尝试将 shebang 写入 python 脚本时收到此奇怪的错误消息 echo usr bin env python gt scripts sandbox py bash usr bin env event
  • 生产构建中的 Create-React-App 代理

    我正在使用带有 Express 后端的 create react app 我的后端在端口 3001 上运行 前端在开发模式下通过端口 3000 运行 我有 proxy http localhost 3001 在我的 package json
  • 不同的 Netty 版本及其用途

    我现在使用Netty有一段时间了 但永远无法解决这个问题 一个人可以下载四个不同的版本 其中三个正在积极开发中 3 x 4 0 x 4 1 x 5 x 据我了解 3 x 适用于 JRE 1 5 而 JRE 的其他所有版本都高于此版本 我使用
  • 如何将异步函数存储在结构中并从结构实例调用它?

    我正在尝试用新的方法来实现这一目标async await句法 std future Futures 和最新版本的 Tokio 我正在使用东京0 2 0 alpha 4和铁锈1 39 0 nightly 我尝试过的不同事情包括 using B