Özet - Closure'lar
- Rust kursu
- Orta seviye
- Ders 47/115
- 5 dk
Closure ve move'u birleştirerek bir sayaç üreten fonksiyon yazarsın.
Closure'lar özeti
Closure: |parametreler| gövde. Türler ilk kullanımda çıkarılır ve sabitlenir. Ortamı okuyarak, değiştirerek ya da sahiplenerek (move) yakalar; buna göre Fn, FnMut veya FnOnce uygular. Fonksiyonlara generic sınırla (F: Fn(i32) -> i32) verilir, impl Fn ile döndürülür. Farklı closure'ları aynı koleksiyonda tutmak için Box<dyn Fn(..)> gerekir, çünkü her closure'ın türü farklıdır.
İşlem tablosu
Adlandırılmış closure'lardan bir tablo kurmak, komut işleyiciler ya da hesap makineleri için kullanışlıdır:
let islemler: Vec<(&str, Box<dyn Fn(i32) -> i32>)> = vec![
("iki katı", Box::new(|x| x * 2)),
("kare", Box::new(|x| x * x)),
("eksi", Box::new(|x| -x)),
];
for (ad, f) in &islemler {
println!("{ad}: {}", f(7));
}Uygulama İşlem tablosu
Yukarıdaki Vec<(&str, Box<dyn Fn(i32) -> i32>)> tablosunu kur ve her işlemi 7 için ad: sonuç biçiminde ayrı satırlara yazdır.
Başlangıç kodu
fn main() {
// buraya yaz
}Örnek çözüm
fn main() {
let islemler: Vec<(&str, Box<dyn Fn(i32) -> i32>)> = vec![
("iki katı", Box::new(|x| x * 2)),
("kare", Box::new(|x| x * x)),
("eksi", Box::new(|x| -x)),
];
for (ad, f) in &islemler {
println!("{}: {}", ad, f(7));
}
}Beklenen çıktı
iki katı: 14 kare: 49 eksi: -7
Soru ve cevaplar
Dersin sorularını cevaplarıyla birlikte inceleyebilirsin. Kendini denemek istersen dersi interaktif olarak çöz.
1 <code>vec![|x| x + 1, |x| x * 2]</code> neden derlenmez?
- x türü yok
- Derlenir
- İki closure'ın türü farklı; vektör tek tür ister Doğru cevap
- Closure vektöre konamaz
Açıklama: Her closure eşsiz bir türdür. Box<dyn Fn(i32) -> i32> ile hepsi aynı trait nesnesi türüne dönüşür.
2 Ortak closure türü
let f: Box<____ Fn(i32) -> i32> = Box::new(|x| x * 2);
let f: Box<dyn Fn(i32) -> i32> = Box::new(|x| x * 2);
Açıklama: Farklı closure'ları tek türde toplamak için dyn Fn trait nesnesi kullanılır.
3 İşlem ve 7 için sonucu
| Kavram | Anlamı |
|---|---|
iki katı |
14 |
kare |
49 |
eksi |
-7 |
|x| x % 3 |
1 |