CodeBlanks Logo Icon CodeBlanks

Capturing

Closure'ın çevre değişkenlerini yakalamasını öğrenirsin.

Capturing

Closure, ortamdaki değişkenleri üç yoldan biriyle yakalar ve derleyici gereken en zayıfını seçer:

  • değiştirilemez ödünç (yalnızca okuyorsa),
  • değiştirilebilir ödünç (değiştiriyorsa),
  • sahiplik (değeri tüketiyorsa ya da move yazılmışsa).
let mut sayac = 0;
let mut artir = || sayac += 1;   // &mut sayac yakalar
artir();
artir();
println!("{sayac}");             // 2

Değiştirilebilir yakalayan closure'ın kendisi de mut olmalıdır; closure yaşadığı sürece sayac başka yerde kullanılamaz.

move ile sahiplik

move, closure'ın tanımlandığı kapsamdan daha uzun yaşaması gerektiğinde kullanılır:

let ad = String::from("Ece");
let selam = move || format!("Merhaba {ad}");
// println!("{ad}");     // hata: ad closure'a taşındı
println!("{}", selam());   // Merhaba Ece

Yalnızca okunan Copy değerler (i32 gibi) move ile kopyalanır; orijinal değişken kullanılmaya devam eder.

Uygulama Yakalama türleri

let mut sayac = 0; değişkenini artıran bir closure ile iki artırma yap ve sayac'ı yazdır. Sonra String::from("Ece") değerini move ile alan ve Merhaba Ece döndüren bir closure yazıp sonucunu yazdır.

Başlangıç kodu

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

Örnek çözüm

main.rs
fn main() {
    let mut sayac = 0;
    let mut artir = || sayac += 1;
    artir();
    artir();
    println!("{}", sayac);
    let ad = String::from("Ece");
    let selam = move || format!("Merhaba {ad}");
    println!("{}", selam());
}

Beklenen çıktı

2
Merhaba Ece

Soru ve cevaplar

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

1 <code>move</code> anahtar kelimesi ne yapar?

  • Değişkenleri kopyalamayı engeller
  • Yakalanan değişkenlerin sahipliğini closure'a aktarır Doğru cevap
  • Closure'ı başka bir dosyaya taşır
  • Closure'ı hızlandırır

Açıklama: Copy türler kopyalanır, diğerleri taşınır. Thread'lere ve fonksiyondan döndürülen closure'lara gereklidir.

2 Sahipliği al

Soru
let ad = String::from("Ece");
let selam = ____ || format!("Merhaba {ad}");
Cevap
let ad = String::from("Ece");
let selam = move || format!("Merhaba {ad}");

Açıklama: move yakalanan değerleri closure'a taşır.

3 Closure gövdesi ve yakalama

Kavram Anlamı
|| println!("{x}") &x
|| x += 1 &mut x
|| drop(s) s (sahiplik)
move || x x'in kopyası/sahipliği

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