Capturing
- Rust kursu
- Orta seviye
- Ders 44/115
- 4 dk
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
moveyazılmışsa).
let mut sayac = 0;
let mut artir = || sayac += 1; // &mut sayac yakalar
artir();
artir();
println!("{sayac}"); // 2Değ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 EceYalnı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
fn main() {
// buraya yaz
}Örnek çözüm
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
let ad = String::from("Ece");
let selam = ____ || format!("Merhaba {ad}");
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 |