我应该在Rust中返回等待吗?

拉普图

在JavaScript中,异步代码是使用Promises和async/await语法编写的,与Rust类似。通常可以认为可以简单地将其返回(即,当异步函数作为另一个函数的最后一部分执行时)返回等待Promise是多余的(因此不鼓励):

async function myFn() { /* ... */ }

async function myFn2() {
  // do setup work

  return await myFn()
  // ^ this is not necessary when we can just return the Promise
}

我想知道在Rust中是否也适用类似的模式。我是否应该这样:

pub async fn my_function(
    &mut self,
) -> Result<()> {
    // do synchronous setup work

    self.exec_command(
        /* ... */
    )
    .await
}

或这个:

pub fn my_function(
    &mut self,
) -> impl Future<Output = Result<()>> {
    // do synchronous setup work

    self.exec_command(
        /* ... */
    )
}

前者对我来说更符合人体工程学,但我怀疑后者可能会更出色。是这样吗

用户名

这两个变体之间的语义差异是,在第一个变体中,同步设置代码仅在等待返回的future时才运行,而在第二个变体中,它将在调用函数后立即运行:

let fut = x.my_function();
// in the second variant, the synchronous setup has finished by now
...
let val = fut.await;  // in the first variant, it runs here

为了使差异明显,同步设置代码必须具有副作用,并且在调用异步函数和等待它返回的将来之间需要有一个延迟。

除非您有特定的原因立即执行序言,否则请使用异步功能(即第一个变体)。它使函数更具可预测性,并且在重构函数时使以后添加更多等待更加容易。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

我应该在单元测试中检查协作者的返回值吗?

来自分类Dev

我应该在模型中抛出HttpStatus异常吗?

来自分类Dev

我应该在交易中包含SELECT吗?

来自分类Dev

我应该在表示层中抛出异常吗?

来自分类Dev

我应该在onDestroyView中删除OnClickListener吗?

来自分类Dev

我应该在virtualenv中安装python 3吗?

来自分类Dev

我应该在C ++的类中存储引用吗?

来自分类Dev

我应该在C ++中删除静态对象吗

来自分类Dev

我应该在virtualenv中安装python 3吗?

来自分类Dev

我应该在系统中杀死僵尸进程吗?

来自分类Dev

我应该在onDestroyView中删除OnClickListener吗?

来自分类Dev

我应该在备份中包含/ dev吗?

来自分类Dev

我应该在Java中嵌套这些类吗?

来自分类Dev

对于UIPageViewControllerDataSource,我应该在presentationIndexForPageViewController:中返回什么?

来自分类Dev

xcworkspace应该在gitignore中吗

来自分类Dev

所有输入都应该在Rust中是可变的吗?

来自分类Dev

我应该在Scala服务中使用Try作为返回类型吗?

来自分类Dev

我应该在返回std :: vector的函数上使用std :: move吗?

来自分类Dev

我应该在导致空集的资源上返回404错误吗?

来自分类Dev

我应该在返回std :: vector的函数上使用std :: move吗?

来自分类Dev

我应该在哪里将配置文件保存在Rust中

来自分类Dev

EF:我应该在我的实体中包括外键ID吗?

来自分类Dev

我可以/应该在文件夹中组织我的30个课程吗?

来自分类Dev

我应该在Rails中明确指定我的助手吗

来自分类Dev

我应该在我的 .htaccess 文件中删除或添加一些东西吗?

来自分类Dev

我也应该在MVC 5中在POST中绑定html.dropdownlistfor吗?

来自分类Dev

在REST API中,要获取资源,我应该在URL中包括资源ID吗?

来自分类Dev

我应该在模糊查询字段中包含空格吗?

来自分类Dev

我应该在DocumentDb中取消规范化或运行多个查询吗?

Related 相关文章

  1. 1

    我应该在单元测试中检查协作者的返回值吗?

  2. 2

    我应该在模型中抛出HttpStatus异常吗?

  3. 3

    我应该在交易中包含SELECT吗?

  4. 4

    我应该在表示层中抛出异常吗?

  5. 5

    我应该在onDestroyView中删除OnClickListener吗?

  6. 6

    我应该在virtualenv中安装python 3吗?

  7. 7

    我应该在C ++的类中存储引用吗?

  8. 8

    我应该在C ++中删除静态对象吗

  9. 9

    我应该在virtualenv中安装python 3吗?

  10. 10

    我应该在系统中杀死僵尸进程吗?

  11. 11

    我应该在onDestroyView中删除OnClickListener吗?

  12. 12

    我应该在备份中包含/ dev吗?

  13. 13

    我应该在Java中嵌套这些类吗?

  14. 14

    对于UIPageViewControllerDataSource,我应该在presentationIndexForPageViewController:中返回什么?

  15. 15

    xcworkspace应该在gitignore中吗

  16. 16

    所有输入都应该在Rust中是可变的吗?

  17. 17

    我应该在Scala服务中使用Try作为返回类型吗?

  18. 18

    我应该在返回std :: vector的函数上使用std :: move吗?

  19. 19

    我应该在导致空集的资源上返回404错误吗?

  20. 20

    我应该在返回std :: vector的函数上使用std :: move吗?

  21. 21

    我应该在哪里将配置文件保存在Rust中

  22. 22

    EF:我应该在我的实体中包括外键ID吗?

  23. 23

    我可以/应该在文件夹中组织我的30个课程吗?

  24. 24

    我应该在Rails中明确指定我的助手吗

  25. 25

    我应该在我的 .htaccess 文件中删除或添加一些东西吗?

  26. 26

    我也应该在MVC 5中在POST中绑定html.dropdownlistfor吗?

  27. 27

    在REST API中,要获取资源,我应该在URL中包括资源ID吗?

  28. 28

    我应该在模糊查询字段中包含空格吗?

  29. 29

    我应该在DocumentDb中取消规范化或运行多个查询吗?

热门标签

归档