`| _ |의 차이점은 무엇입니까 비동기 이동 {}`및`비동기 이동 | _ | {}`


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)

답변:


6

하나는 비동기 블록 (정확한 내용으로 비동기 블록을 본문으로하는 클로저)이고 다른 하나는 비동기 클로저입니다. 비동기 / 대기 RFC 당 :

async || 폐쇄

함수 외에도 비동기를 클로저에 적용 할 수도 있습니다. 비동기 함수와 마찬가지로 비동기 클로저는의 반환 유형이 impl Future<Output = T>아닌 T입니다.

반면에 :

async 블록

async블록을 사용하여 미래를 직접 표현으로 만들 수 있습니다 . 이 양식은 즉시 호출 된 async클로저 와 거의 동일합니다 .

 async { /* body */ }

 // is equivalent to

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

그와 같은 제어 흐름 구조를 제외시켰다 return, breakcontinue본체 내에서 허용되지 않는다.

move여기 키워드는 비동기 폐쇄 및 블록 변수들은 가까운 이상의 캡처 소유권에 있음을 나타내는 것입니다.

그리고 분명히 비동기 폐쇄는 여전히 불안정한 것으로 간주됩니다. 그것은이 이 추적 문제를 .


수입에 차이가 없나요?
dronte7 '12

@ dronte7 nope, 사실 하나는 불안정합니다.
edwardw

둘 다 서라운드 변수를 얻지 않고 즉시 ot로 미래로 변합니다. 불안정한 비동기 폐쇄를 제외하고는 외부 변수를 얻는 비동기 블록과 동일합니까?
dronte7 '12

@ dronte7 은 호출 될 때 둘 다 Future를 반환합니다 . 변수를 캡처하는 한 동일합니다. 이것이 클로저의 의미이며, 비동기 적이든 아니든.
edwardw

2
변수를 캡처하는 것은 두 경우 모두 매우 다르다고 생각합니다. async move || ...변수를 둘러싸는 블록 || async move {...}에서 클로저로 이동하고 변수를 클로저에서 비동기 블록으로 옮깁니다. 둘러싸는 블록에서 비동기 블록으로 옮기려면 move || async move {...}지금 사용해야한다고 생각합니다 .
Sven Marnach '12
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.