Iterators: map, filter ve fold ile Fonksiyonel Programlama

  • Konbuyu başlatan Konbuyu başlatan irfo
  • Başlangıç tarihi Başlangıç tarihi

irfo

Moderatör
Katılım
7 Ocak 2026
Mesajlar
290
Tepkime puanı
2
Puanları
18
Rust'ta Iterator'lar (Yineleyiciler), bir koleksiyonun (vektörler, diziler, hashmapler) öğeleri üzerinde sırayla işlem yapmanızı sağlayan güçlü bir mekanizmadır. Rust'ın "Zero-cost Abstractions" felsefesinin en iyi örneklerinden biridir: Bu fonksiyonel yöntemleri kullanmak, elle yazılmış bir for döngüsüyle aynı hızda çalışır.

1. Iterator Mantığı ve Tembel Çalışma (Lazy Evaluation)​

Rust'ta iterator'lar tembeldir. Yani, siz onları tüketene kadar (bir sonuca dönüştürene kadar) hiçbir işlem yapmazlar.
Rust
Kod:
let sayilar = vec![1, 2, 3];
let iter = sayilar.iter().map(|x| x + 1); 
// Burada henüz hiçbir şey toplanmadı veya hesaplanmadı.

2. Temel Iterator Metotları​

İşlemleri gerçekleştirmek için üç ana aşama vardır: Oluşturma, Dönüştürme (Adapters) ve Tüketme (Consumers).

A. map: Her Öğeyi Dönüştürme​

Her bir öğeye bir fonksiyon uygular ve yeni bir iterator döner.
Rust
Kod:
let sayilar = vec![1, 2, 3];
let kareleri: Vec<_> = sayilar.iter().map(|x| x * x).collect();
// Sonuç: [1, 4, 9]

B. filter: Koşula Göre Seçme​

Belirli bir şartı sağlayan (true dönen) öğeleri tutar, diğerlerini eler.
Rust
Kod:
let sayilar = vec![1, 2, 3, 4, 5, 6];
let çiftler: Vec<_> = sayilar.into_iter().filter(|x| x % 2 == 0).collect();
// Sonuç: [2, 4, 6]

C. fold (veya reduce): Tek Bir Değere İndirgeme​

Tüm öğeleri birleştirerek tek bir sonuç üretir (Toplam, çarpım, string birleştirme vb.).
Rust
Kod:
let sayilar = vec![1, 2, 3, 4];
// fold(başlangıç_değeri, |akümülatör, öğe| ...)
let toplam = sayilar.iter().fold(0, |acc, x| acc + x);
// Sonuç: 10

3. Zincirleme İşlemler​

Iterator'ların asıl gücü, bu metotları uç uca ekleyebilmenizden gelir. Okunabilirliği artırır ve karmaşık mantıkları basitleştirir.
Rust
Kod:
let sayilar = vec![1, 2, 3, 4, 5, 6, 7, 8, 9, 10];

let sonuc: i32 = sayilar.iter()
    .filter(|&&x| x % 2 == 0) // Çiftleri seç
    .map(|&x| x * 10)         // 10 ile çarp
    .take(3)                  // İlk 3 tanesini al
    .sum();                   // Topla (bir consumer'dır)

// 20 + 40 + 60 = 120

4. İterasyon Türleri​

Rust'ta bir koleksiyon üzerinde üç farklı şekilde iterator oluşturabilirsiniz:
MetotSahiplik (Ownership)Tip
.iter()Ödünç alır (Immutable)&T
.iter_mut()Ödünç alır (Mutable)&mut T
.into_iter()Sahipliği devralırT
 
Geri
Üst