`| _ | Arasındaki fark nedir zaman uyumsuz hareket {} `ve` zaman uyumsuz hareket | _ | {} '


10

Aşağıdaki örnekleri ele alalım:

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"

Bunun |x| async move {}yerine ifadeyi soruyorum async move |x| {}. İkincisi daha açıktır, ancak derleme hatasına girer:

error[E0658]: async closures are unstable

Sonra merak ediyorum, async move || {}ve arasındaki fark nedir || async move {}. Her ikisi de moveanahtar kelimeyi kullanmak için kapaklar gibi görünüyor .

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

Yanıtlar:


7

Biri async bloğudur (gövdesi kesin olarak async bloğu olan bir kapatma), diğeri async kapatmadır. Başına zaman uyumsuz / bekliyoruz RFC :

async || kapanışları

Fonksiyonlara ek olarak, asenkron kapamalara da uygulanabilir. Eşzamansız bir işlev gibi, eşzamansız bir kapanış da dönüş türüne impl Future<Output = T>sahiptir T.

Diğer yandan:

async bloklar

Bir asyncbloğu kullanarak doğrudan bir ifade olarak bir gelecek oluşturabilirsiniz . Bu form hemen çağrılan bir asynckapatmaya neredeyse eşdeğerdir :

 async { /* body */ }

 // is equivalent to

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

gibi o kontrol akış yapıları hariç return, breakve continuevücut içinde izin verilmez.

Buradaki moveanahtar kelime, eşzamansız kapatma ve bloğun, kapattıkları değişkenlerin sahipliğini yakalamak olduğunu belirtmektir.

Ve görünüşe göre, asenkron kapanma hala kararsız olarak kabul ediliyor. It has bu izleme sorunu .


Yani şu anda ithalatında hiçbir fark yok, değil mi?
dronte7

@ dronte7 hayır, dengesiz olmasının dışında.
edwardw

her ikisi de bazı surround değişkenleri edinmeden derhal bir geleceğe dönüşür. kararsız async kapatılması dışında harici değişkenlerin edinilmesinde async bloğu ile aynıdır, değil mi?
dronte7

@ her ikisi de geri dönüş bir gelecek dronte7 zaman olarak adlandırılır. Değişkenleri yakalamak kadar, bunlar da aynıdır. Kapanmanın anlamı budur, asenkron ya da değil.
edwardw

2
Her iki durumda da değişkenleri yakalamanın oldukça farklı olduğunu düşünüyorum. async move || ...değişkenleri çevreleyen bloktan kapatmaya, || async move {...}değişkenleri kapatmadan da zaman uyumsuz bloğa taşır. eğer onları çevreleyen bloktan eşzamansız bloğa taşımak istiyorsanız, move || async move {...}şimdilik kullanmanız gerektiğini düşünüyorum .
Sven Marnach
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.