Rust’ta Closure (Kapanış) ve Iterator Kullanımı

  • 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 Closures (Kapanışlar) ve Iterators (Yineleyiciler), fonksiyonel programlama dünyasından ödünç alınan ve Rust'ın yüksek performanslı yapısıyla birleşen iki güçlü araçtır. Bu yapılar, kodun daha okunabilir, kısa ve hataya karşı dirençli olmasını sağlar.


1. Closures (Kapanışlar)​

Closures, bir değişkene atanabilen veya başka fonksiyonlara argüman olarak geçilebilen "isimsiz fonksiyonlardır". Normal fonksiyonlardan en büyük farkı, tanımlandıkları kapsamdaki (scope) değişkenleri yakalayabilmeleridir (capture).

Sözdizimi​

Kapanışlar, parametrelerini dikey çizgiler || arasında alır.

Kod:
let toplama = |a: i32, b: i32| a + b;let sonuc = toplama(5, 5);

Kapsamı Yakalama (Capturing Environment)​

Bir closure, çevresindeki değişkenleri üç şekilde yakalayabilir:

  1. Borrowing Immutable (&T): Veriyi sadece okur.
  2. Borrowing Mutable (&mut T): Veriyi değiştirebilir.
  3. Moving (T): Verinin sahipliğini alır (genellikle move anahtar kelimesiyle yapılır).
Kod:
let x = 4;let esit_mi = move |z| z == x; // x'in sahipliğini closure içine taşır


2. Iterators (Yineleyiciler)​

Rust'ta Iterator'lar, bir dizi öğe üzerinde sırayla işlem yapmanızı sağlayan yapılardır. Rust'ta yineleyiciler tembeldir (lazy); yani siz bir "tüketici" metod çağırmadığınız sürece hiçbir işlem yapmazlar.

Temel Iterator Kullanımı​

Her yineleyici next metoduna sahip bir Iterator trait'ini uygular.

Kod:
let v1 = vec![1, 2, 3];let v1_iter = v1.iter(); // Yineleyici oluşturuldu (henüz işlem yok)

for val in v1_iter {println!("Değer: {}", val);}


3. Adaptörler ve Tüketiciler​

Iterator'lar iki tip metod ile çalışır:

A. Iterator Adaptörleri (İşlem Yapanlar)​

Bir yineleyiciyi alıp başka bir yineleyiciye dönüştürürler. Tembeldirler.

  • map: Her öğeyi bir closure ile dönüştürür.
  • filter: Koşula uymayan öğeleri ayıklar.
  • enumerate: Öğeyi indeksiyle birlikte döner.

B. Tüketiciler (Sonucu Üretenler)​

Yineleyiciyi işleme sokar ve bir sonuç üretirler.

  • collect: Yineleyiciyi bir koleksiyona (Vektör vb.) dönüştürür.
  • sum: Tüm öğeleri toplar.
  • find: Belirli bir öğeyi arar.
Kod:
let sayilar = vec![1, 2, 3, 4, 5];

// Zincirleme kullanım: Çiftleri bul, 2 ile çarp ve vektöre toplalet sonuc: Vec<i32> = sayilar.iter().filter(|&x| x % 2 == 0).map(|x| x * 2).collect();

println!("{:?}", sonuc); // [4, 8]


4. Performans: "Zero-Cost Abstractions"​

Rust'ta iterator kullanmak, manuel bir for döngüsü yazmaktan genellikle daha hızlıdır. Bunun sebebi:

  1. Bounds Check Elimination: Derleyici, yineleyici sınırlarını bildiği için dizi sınır kontrollerini (index out of bounds) optimize ederek kaldırır.
  2. Unrolling: Derleyici, döngüleri işlemci seviyesinde daha verimli hale getirir.

Özet​

  • Closures, çevrelerindeki verileri yakalayabilen esnek fonksiyon bloklarıdır.
  • Iterators, veriyi verimli ve güvenli bir şekilde işleyen akışlardır.
  • Tembellik, karmaşık veri işleme zincirlerini sadece ihtiyaç duyulduğunda çalıştırarak bellek ve CPU tasarrufu sağlar.
 
Geri
Üst