async block
- Rust kursu
- İleri seviye
- Ders 4/81
- 4 dk
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)); // 42Bu 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
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
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şı
let ad = String::from("Ece");
let f = async ____ {
format!("{ad} hazır")
};
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 |