🚀 BAŞTAN SONA RUST DİLİ BÖLÜM-14: Closures (Kapanışlar) ve Iterators (Yineleyiciler) 🌀

Konu Özeti

Rust programlama dilinde closures (anonim fonksiyonlar) ve iterators (yineleyiciler) konuları ele alınıyor. Closure'ların değişken yakalama yöntemleri (borrowing, mutable borrowing, move) ve Fn, FnMut, FnOnce trait'leri açıklanıyor. Iterator'ların lazy çalışma prensibi, iter(), iter_mut(), into_iter() metotları ve map, filter, collect gibi adaptörler örneklerle gösteriliyor. Ayrıca Rust'ta iterator'ların sıfır maliyetli soyutlama sayesinde yüksek performans sağladığı vurgulanıyor.

🚀 BAŞTAN SONA RUST DİLİ BÖLÜM-14: Closures (Kapanışlar) ve Iterators (Yineleyiciler) 🌀

Selamlar! Serimizin 14. bölümüne hoş geldiniz.

Önceki bölümde Rust'ın bellek güvenliği mekanizmalarının temeli olan Lifetimes (Yaşam Süreleri) ve Borrow Checker konularını incelemiştik. Bu bölümde ise Rust'ın işlevsel programlama (functional programming) yönünü ortaya çıkaran iki güçlü bileşeni öğreneceğiz: **Closures (Anonim Fonksiyonlar)** ve **Iterators (Yineleyiciler)**.

---

📌 1. Closures (Kapanışlar / Anonim Fonksiyonlar) 🎯

Closure, bir değişkene atanabilen veya başka fonksiyonlara parametre olarak geçirilebilen anonim (isimsiz) bir fonksiyondur.

Normal fonksiyonlardan (`fn`) en büyük farkı: **Tanımlandıkları kapsama alanındaki (scope) değişkenleri yakalayabilmeleridir (capture).**

### Temel Syntax ve Yazım Esnekliği:

// Normal fonksiyon
fn arti_bir_v1(x: u32) -> u32 { x + 1 }

// Tam tip tanımlı Closure
let arti_bir_v2 = |x: u32| -> u32 { x + 1 };

// Tip çıkarımlı (Type inference) kısa yazım
let arti_bir_v3 = |x| x + 1;

fn main() {
let sonuc = arti_bir_v3(5); // x tipi burada i32 olarak sabitlenir
println!("Sonuç: {}", sonuc);
}

---

🧠 2. Scope'tan Değişken Yakalama Yöntemleri 🎣

Closure'lar çevrelerindeki değişkenleri 3 farklı şekilde yakalayabilir:

1. **Borrowing (Immutable):** `&T` - Veriyi sadece okumak için ödünç alır.
2. **Mutable Borrowing:** `&mut T` - Veriyi değiştirmek için ödünç alır.
3. **Taking Ownership (Move):** `T` - Verinin sahipliğini tamamen alır.

### `move` Anahtar Kelimesi:
Eğer Closure'un yakaladığı değişkenlerin sahipliğini tamamen üzerine almasını istiyorsak (örneğin veriyi başka bir Thread'e aktarırken) `move` kelimesi kullanılır:

fn main() {
let liste = vec![1, 2, 3];

// 'move' ile 'liste' değişkeninin sahipliği Closure içine taşınır
let sahiplenen_closure = move || {
println!("Vektör: {:?}", liste);
};

sahiplenen_closure();
// println!("{:?}", liste); // HATA! 'liste' artık geçersizdir, move edildi.
}

---

🎭 3. Closure Trait'leri (`Fn`, `FnMut`, `FnOnce`) ⚙️

Her Closure derleyici tarafından otomatik olarak şu 3 Trait'ten en az birini uygular:

• **`FnOnce`:** Çevreden yakaladığı verilerin sahipliğini tüketir. Sadece **BİR KEZ** çağrılabilir.
• **`FnMut`:** Çevredeki verileri değiştirebilir (`&mut`). Birden fazla kez çağrılabilir.
• **`Fn`:** Çevredeki verileri değiştirmeden sadece okur (`&`). Güvenle defalarca ve eşzamanlı çağrılabilir.

---

🔄 4. Iterators (Yineleyiciler) 🌾

Iterator, bir dizi eleman üzerinde sırayla gezinmemizi ve her adımda bir işlem yapmamızı sağlayan bir desendir.

Rust'ta Iterator'lar **Lazy (Tembel)** çalışır. Yani siz tüketici bir metot çağırmadığınız sürece Iterator hiçbir işlem yapmaz!

pub trait Iterator {
type Item;
fn next(&mut self) -> Option<Self::Item>; // Her adımda bir sonraki elemanı döner
}

### Iterator Oluşturma Yöntemleri:
• `iter()`: Elemanların immutable referanslarını (`&T`) döner.
• `iter_mut()`: Elemanların mutable referanslarını (`&mut T`) döner.
• `into_iter()`: Elemanların sahipliğini (`T`) alarak tüketir.

fn main() {
let v1 = vec![1, 2, 3];

let mut v1_iter = v1.iter();

// .next() her çağrıldığında Option döner
assert_eq!(v1_iter.next(), Some(&1));
assert_eq!(v1_iter.next(), Some(&2));
assert_eq!(v1_iter.next(), Some(&3));
assert_eq!(v1_iter.next(), None); // Eleman bitti
}

---

🛠️ 5. Iterator Adaptörleri ve Tüketicileri 🧬

Iterator metotları iki ana gruba ayrılır:

### A. Consuming Adaptors (Tüketici Metotlar)
Iterator'ı tüketip tek bir nihai değer üretirler (`sum`, `collect`, `count` vb.).

fn main() {
let v1 = vec![1, 2, 3];
let v1_iter = v1.iter();

let toplam: i32 = v1_iter.sum(); // Iterator tüketildi!
println!("Toplam: {}", toplam);
}

### B. Iterator Adaptors (Dönüştürücü Metotlar)
Mevcut Iterator'dan yeni bir Iterator türetirler (`map`, `filter`, `zip` vb.). **Lazy oldukları için sonlarına bir tüketici metot (`collect` gibi) eklenmelidir!**

fn main() {
let sayilar = vec![1, 2, 3, 4, 5, 6];

// Çift sayıları filtrele, 2 ile çarp ve yeni bir Vector içinde topla
let sonuc: Vec<i32> = sayilar
.into_iter()
.filter(|n| n % 2 == 0) // Sadece çiftleri al
.map(|n| n * 2) // 2 ile çarp
.collect(); // Yeni koleksiyona dönüştür (Tüketici)

println!("İşlenmiş Veri: {:?}", sonuc); // [4, 8, 12]
}

---

⚡ 6. Performans: Loop vs Iterator 🚀

Java veya Python gibi dillerde yüksek seviyeli fonksiyonel metotlar (`map`, `filter`) geleneksel `for` döngülerine göre bir miktar yavaş çalışabilir.

Ancak Rust'ta durum farklıdır: **Iterators, Rust'ın Zero-Cost Abstraction (Sıfır Maliyetli Soyutlama) ilkelerine dayanır.**

Derleyici, Iterator zincirlerini derleme aşamasında en optimize makine koduna (genellikle unrolled döngülere) dönüştürür. Çoğu senaryoda elle yazılmış bir `for` döngüsünden daha hızlı veya tam olarak aynı performansta çalışır!

---

📝 Bölüm Özeti ve Gelecek Bölüm 🔮

Bu bölümde Closures yapısını, `move` kullanımını, Closure Trait'lerini (`Fn`, `FnMut`, `FnOnce`), Iterator çalışma mantığını ve `map`/`filter`/`collect` gibi güçlü fonksiyonel adaptörleri öğrendik.

👉 **Bölüm 15'te Bizi Ne Bekliyor?**
• Akıllı İşaretçiler (Smart Pointers) 🧠
• **`Box<T>`:** Heap üzerinde veri ayırma
• **`Deref`** ve **`Drop`** Trait'leri
• **`Rc<T>`** (Reference Counted)
ve **`RefCell<T>`** (Interior Mutability)

Sorularınızı konu altından iletebilirsiniz. Bir sonraki bölümde görüşmek üzere! 🦀✨

🔒 Bu içeriği görmek için giriş yapın

 
Yanıt yazmak için giriş yapmalısınız
Forum özelliklerini kullanmak ve Level 2 üyelik satın almak için hesabınıza giriş yapın.
135,050Konular
3,297,712Mesajlar
326,237Kullanıcılar
thekral21Son Üye
Üst Alt