อะไรคือความแตกต่างระหว่าง `| _ | async move {} `และ` async move | _ | {} `


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

หนึ่งคือบล็อก async (ปิดด้วย async บล็อกเป็นตัวที่จะแม่นยำ) ในขณะที่อื่น ๆ ปิด async ต่อasync / รอ RFC :

async || ปิด

นอกเหนือจากฟังก์ชั่นแล้ว async ยังสามารถนำไปใช้กับการปิด เช่นเดียวกับฟังก์ชั่น async, ปิด async มีประเภทการกลับมาของมากกว่าimpl Future<Output = T>T

ในทางกลับกัน:

async บล็อก

คุณสามารถสร้างอนาคตโดยตรงเป็นนิพจน์โดยใช้asyncบล็อก ฟอร์มนี้เกือบจะเทียบเท่ากับการasyncปิดการเรียกใช้ทันที:

 async { /* body */ }

 // is equivalent to

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

ยกเว้นว่าโครงสร้างการควบคุมการไหลเช่นreturn, breakและcontinueไม่ได้รับอนุญาตภายในร่างกาย

moveคำหลักที่นี่คือการแสดงว่าที่ปิด async และบล็อกจะเป็นเจ้าของจับภาพของตัวแปรที่พวกเขาใกล้กว่า

และเห็นได้ชัดว่าการปิด async นั้นยังถือว่าไม่เสถียร แต่ก็มีการติดตามปัญหานี้


ดังนั้นจึงไม่มีความแตกต่างในการนำเข้าตอนนี้ใช่ไหม
dronte7

@ dronte7 ไม่นอกเหนือจากความจริงที่ไม่เสถียร
edwardw

พวกเขาทั้งสองกลายเป็นอนาคตทันทีโดยไม่ต้องรับตัวแปรเสียงเซอร์ราวด์ ยกเว้นการปิด async ที่ไม่เสถียรเหมือนกับ async block ที่รับตัวแปรภายนอกใช่หรือไม่
dronte7

@ dronte7 พวกเขาทั้งสองกลับสู่อนาคตเมื่อถูกเรียก เท่าที่จับตัวแปรพวกมันก็เหมือนกัน นั่นคือสิ่งที่การปิดบัญชีหมายถึง async หรือไม่
edwardw

2
ฉันคิดว่าการจับตัวแปรต่างกันมากในทั้งสองกรณี async move || ...จะย้ายตัวแปรจากบล็อกที่รวมอยู่ในส่วนปิดในขณะที่|| async move {...}จะย้ายตัวแปรจากกลุ่มที่ถูกปิดไปยังบล็อก async หากคุณต้องการย้ายพวกมันจากบล็อกที่ล้อมไว้ในบล็อก async ฉันคิดว่าคุณจำเป็นต้องใช้move || async move {...}ตอนนี้
Sven Marnach
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.