`| _ |和有什么不一样?异步移动{}`和`异步移动| _ | {}`


10

让我们考虑以下示例:

use futures::executor::block_on;
use futures::future::{FutureExt, TryFutureExt};


async fn fut1() -> Result<String, u32> {
  Ok("ok".to_string())
}

fn main() {
    println!("Hello, world!");
    match block_on(fut1().and_then(|x| async move { Ok(format!("{} is \"ok\"", x)) })) {
      Ok(s) => println!("{}", s),
      Err(u) => println!("{}", u)
    };
}

货代

[dependencies]
futures = "^0.3"

我要问的是表达式|x| async move {}而不是async move |x| {}。后者更为明显,但是会遇到编译错误:

error[E0658]: async closures are unstable

然后我想知道async move || {}和之间有什么区别|| async move {}。它们似乎都是使用move关键字的闭包。

$ rustc --version
rustc 1.39.0 (4560ea788 2019-11-04)

Answers:


6

一个是异步块(确切地说是一个以异步块为主体的闭包),而另一个是异步闭包。每次异步/等待RFC

async || 关闭

除了功能之外,异步还可以应用于闭包。与异步函数类似,异步闭包的返回类型为impl Future<Output = T>,而不是T

另一方面:

async

您可以使用async块直接将Future创建为表达式。这种形式几乎等同于立即调用的async闭包:

 async { /* body */ }

 // is equivalent to

 (async || { /* body */ })()

除了像这样的控制流构造returnbreak并且continue在体内不允许使用。

move此处的关键字表示异步闭包和块将捕获其关闭的变量的所有权。

显然,异步关闭仍然被认为是不稳定的。它具有此跟踪问题


因此,现在其导入没有区别,不是吗?
dronte19年

@ dronte7不,除了事实是不稳定。
edwardw

它们都立即与ot变成Future,而无需获取一些周围变量。除了不稳定之外,异步闭合与获取外部变量的异步块相同,不是吗?
dronte19年

@ dronte7都被调用都返回Future 。至于捕获变量,它们也相同。这就是闭包所代表的,无论是否异步。
edwardw '19

2
我认为在两种情况下捕获变量都大不相同。async move || ...会将变量从封闭块移到闭包中,而|| async move {...}将变量从封闭块移到异步块中。如果要将它们从封闭的块移到异步块,我认为您move || async move {...}现在需要使用。
Sven Marnach
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.