CodeBlanks Logo Icon CodeBlanks

async block

async {} bloğu ile anonim future yaratırsın.

async block

async { .. } bloğu, fonksiyon tanımlamadan yerinde bir Future oluşturur. move ile yakaladığı değerlerin sahipliğini alır; bir göreve gönderilecek Future'lar için gereklidir:

let ad = String::from("Ece");
let f = async move {
    format!("{ad} hazır")
};
// ad artık f'nin içinde
let sonuc = block_on(f);

Async bloklar closure'lara benzer ama çağrılmazlar; değerlendirilince bir Future üretirler.

Async closure'lar

Bir closure'dan Future döndürmek için gövdeyi async blok yapmak yeterlidir. Rust 1.85 ile async || .. yazımı da kararlı hale geldi:

let ikile = |x: u32| async move { x * 2 };
let f = ikile(21);          // Future
println!("{}", block_on(f)); // 42

Bu desen, bir koleksiyondaki her öğe için asenkron iş başlatırken sık kullanılır.

Uygulama Async bloklar

let ad = String::from("Ece"); değerini async move bloğuyla yakalayıp "Ece hazır" üreten bir Future oluştur. Ayrıca |x: u32| async move { x * 2 } closure'ını 21 ile çağır. İki sonucu block_on ile alıp boşlukla yazdır.

Başlangıç kodu

main.rs
use std::future::Future;
use std::pin::pin;
use std::task::{Context, Poll, Waker};

fn block_on<F: Future>(f: F) -> F::Output {
    let mut f = pin!(f);
    let mut cx = Context::from_waker(Waker::noop());
    loop {
        if let Poll::Ready(v) = f.as_mut().poll(&mut cx) {
            return v;
        }
    }
}

fn main() {
    // buraya yaz
}

Örnek çözüm

main.rs
use std::future::Future;
use std::pin::pin;
use std::task::{Context, Poll, Waker};

fn block_on<F: Future>(f: F) -> F::Output {
    let mut f = pin!(f);
    let mut cx = Context::from_waker(Waker::noop());
    loop {
        if let Poll::Ready(v) = f.as_mut().poll(&mut cx) {
            return v;
        }
    }
}

fn main() {
    let ad = String::from("Ece");
    let f = async move { format!("{ad} hazır") };
    let ikile = |x: u32| async move { x * 2 };
    println!("{} {}", block_on(f), block_on(ikile(21)));
}

Beklenen çıktı

Ece hazır 42

Soru ve cevaplar

Dersin sorularını cevaplarıyla birlikte inceleyebilirsin. Kendini denemek istersen dersi interaktif olarak çöz.

1 Async bloğun içinde <code>?</code> kullanılırsa hata nereye döner?

  • Panic verir
  • Kullanılamaz
  • Bloğun kendi sonucuna; çevredeki fonksiyondan çıkmaz Doğru cevap
  • Çevredeki fonksiyondan çıkar

Açıklama: Async blok kendi dönüş noktası olan ayrı bir gövdedir; türü çoğu zaman açıkça belirtmek gerekir: async { Ok::<_, String>(..) }.

2 Sahipliği taşı

Soru
let ad = String::from("Ece");
let f = async ____ {
    format!("{ad} hazır")
};
Cevap
let ad = String::from("Ece");
let f = async move {
    format!("{ad} hazır")
};

Açıklama: async move, yakalanan değerleri Future'ın içine taşır.

3 Yazım ve sonuç

Kavram Anlamı
async { 1 } Future<Output = i32>
async move { ad } ad'ı sahiplenir
|x| async move { x * 2 } Future döndüren closure
block_on(async { 7 }) 7

İleri seviye bölümündeki tüm dersler