`| _ |の違いは何ですか 非同期移動{} `および`非同期移動| _ | {} `


10

次の例を考えてみましょう:

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

Cargo.toml

[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)

回答:


7

1つは非同期ブロック(正確にはasyncブロックを本体とするクロージャー)であり、もう1つは非同期クロージャーです。非同期/待機RFCごと:

async || 閉鎖

関数に加えて、asyncはクロージャーにも適用できます。非同期関数と同様に、非同期クロージャーの戻り値の型はimpl Future<Output = T>ではなくですT

一方:

async ブロック

asyncブロックを使用して、式としてフューチャーを直接作成できます。このフォームは、すぐに呼び出されるasyncクロージャーとほぼ同じです。

 async { /* body */ }

 // is equivalent to

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

その制御フロー構築物が好き除いてreturnbreakそしてcontinue身体の中に許可されていません。

moveここでのキーワードは、非同期クロージャとブロックが、それらが閉じる変数の所有権を取得することであることを示しています。

そしてどうやら、非同期クロージャはまだ不安定であると見なされています。それは持っているこの追跡問題を


ですから、現時点ではインポートに違いはありませんね。
dronte7

@ dronte7いいえ、1つは不安定です。
edwardw

それらは両方とも、いくつかのサラウンド変数を取得することなく、すぐにotで未来に変わります。不安定な非同期クロージャーであることを除いて、外部変数を取得する非同期ブロックと同じですよね?
dronte7

@ dronte7彼らが将来戻る両方と呼ばれているが。変数のキャプチャに関する限り、それらも同じです。それは、クロージャーが非同期であるかどうかを意味します。
edwardw

2
変数のキャプチャは、どちらの場合もかなり異なると思います。async move || ...変数を囲んでいるブロックからクロージャに|| async move {...}移動し、変数をクロージャから非同期ブロックに移動します。それらを囲みブロックから非同期ブロックに移動したい場合はmove || async move {...}、今のところ使用する必要があると思います。
Sven Marnach
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.