Sự khác biệt giữa `| _ | di chuyển async {} `và` async di chuyển | _ | {} `


10

Hãy xem xét các ví dụ sau:

chính

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

Vận chuyển hàng hóa

[dependencies]
futures = "^0.3"

Tôi đang hỏi về biểu thức |x| async move {}thay vì async move |x| {}. Cái sau rõ ràng hơn, nhưng nó chạy vào lỗi biên dịch:

error[E0658]: async closures are unstable

Sau đó tôi tự hỏi, sự khác biệt giữa async move || {}|| async move {}. Cả hai dường như đóng cửa để sử dụng movetừ khóa.

$ rustc --version
rustc 1.39.0 (4560ea788 2019-11-04)

Câu trả lời:


7

Một là khối async (một bao đóng với khối async là chính xác của nó), trong khi khối kia là đóng async. Mỗi async / đang chờ RFC :

async || đóng cửa

Ngoài các chức năng, async cũng có thể được áp dụng cho các bao đóng. Giống như một hàm async, bao đóng async có kiểu trả về impl Future<Output = T>, thay vì T.

Mặt khác:

async khối

Bạn có thể tạo một tương lai trực tiếp dưới dạng một biểu thức bằng cách sử dụng một asynckhối. Hình thức này gần như tương đương với một asyncđóng cửa được gọi ngay lập tức :

 async { /* body */ }

 // is equivalent to

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

ngoại trừ các cấu trúc dòng điều khiển như thế return, breakcontinuekhông được phép trong cơ thể.

Các movetừ khóa ở đây là để biểu thị rằng việc đóng cửa async và ngăn chặn được sở hữu chụp của các biến họ gần kết thúc.

Và rõ ràng, đóng async vẫn được coi là không ổn định. Nó có vấn đề theo dõi này .


Vì vậy, không có sự khác biệt trong nhập khẩu của nó ngay bây giờ, phải không?
dronte7

@ dronte7 không, ngoài thực tế là không ổn định.
edwardw

cả hai ngay lập tức biến thành Tương lai với ot mà không thu được một số biến xung quanh. ngoại trừ việc đóng async không ổn định cũng giống như khối async với việc lấy các biến bên ngoài, phải không?
dronte7

@ dronte7 cả hai đều trả lại Tương lai khi được gọi. Theo như nắm bắt các biến, chúng cũng giống nhau. Đó là những gì đóng cửa là viết tắt, không đồng bộ hay không.
edwardw

2
Tôi nghĩ rằng việc nắm bắt các biến là khá khác nhau trong cả hai trường hợp. async move || ...sẽ di chuyển các biến từ khối kèm theo vào bao đóng, trong khi || async move {...}sẽ di chuyển các biến từ bao đóng sang khối async. nếu bạn muốn chuyển chúng từ khối kèm theo sang khối async, tôi nghĩ bạn cần sử dụng move || async move {...}ngay bây giờ.
Sven Marnach
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.