rust '有什么区别|_|异步移动{}'和'异步移动|_|{}'

67up9zun  于 2023-01-05  发布在  其他
关注(0)|答案(2)|浏览(138)

让我们考虑以下示例:

    • 主文件. rs**
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)
0md85ypi

0md85ypi1#

一个是async块(准确地说是以async块作为其主体的闭包),另一个是async闭包。
async ||密封件
除了函数之外,异步也可以应用于闭包,和异步函数一样,异步闭包的返回类型是impl Future<Output = T>,而不是T
另一方面:
async数据块
可以使用async块直接创建future作为表达式,这种形式几乎等同于立即调用async闭包:

async { /* body */ }

 // is equivalent to

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

除了像returnbreakcontinue这样的控制流构造不允许在主体内。
这里的move关键字表示异步闭包和块将捕获它们所关闭的变量的所有权。
显然,异步闭包仍然被认为是不稳定的,它有this tracking issue

8wigbo56

8wigbo562#

至于这里前面的一些评论,似乎有各种"issues"属于正确的语法。

(move |x| async move {foo(x)})(x).await

应该完全等于

(move |x| {async move {foo(x)}})(x).await

因为一个受保护的闭包显然不能在保护之外声明为async,而在保护之内声明async只会打开另一个代码块,省略括号。第二个move将所有受影响的变量--已经移到闭包中--移到异步“安全空间”中,所以看起来async move的所有可能的保护都在这里应用了。

相关问题