CodeBlanks Logo Icon CodeBlanks

Özet - Closure'lar

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

main.rs
fn main() {
    // buraya yaz
}

Örnek çözüm

main.rs
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ü

Soru
let f: Box<____ Fn(i32) -> i32> = Box::new(|x| x * 2);
Cevap
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

Orta seviye bölümündeki tüm dersler