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

dro*_*te7 28 rust

让我们考虑以下示例:

主文件

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)
    };
}

Run Code Online (Sandbox Code Playgroud)

Cargo.toml

[dependencies]
futures = "^0.3"
Run Code Online (Sandbox Code Playgroud)

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

error[E0658]: async closures are unstable
Run Code Online (Sandbox Code Playgroud)

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

$ rustc --version
rustc 1.39.0 (4560ea788 2019-11-04)
Run Code Online (Sandbox Code Playgroud)

edw*_*rdw 20

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

async || 关闭

除了函数,async 也可以应用于闭包。与异步函数一样,异步闭包的返回类型为impl Future<Output = T>,而不是T

另一方面:

async

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

 async { /* body */ }

 // is equivalent to

 (async || { /* body */ })()
Run Code Online (Sandbox Code Playgroud)

除了像return,break和 之类的控制流结构之外,continue主体中不允许使用。

move这里的关键字是表示异步闭包和块将捕获它们关闭的变量的所有权。

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

  • 我认为在这两种情况下捕获变量是完全不同的。`异步移动|| ...` 会将变量从封闭块移动到闭包中,而 `|| async move {...}` 会将变量从闭包移动到 async 块中。如果你想将它们从封闭块移动到异步块中,我认为你需要使用`move || 现在异步移动 {...}`。 (7认同)