Rust Iterator ve Closure

Veli Uysal
Turkiye Rust Community
3 min readMay 16, 2023

--

Bir çok dilde olan fonksiyonel programlama özellikleri Rust dilinde de bulunmaktadır. Fonksiyonel programlama ile bizim yazdıklarımız daha efektif, anlaşılır ve daha okunaklı olmaktadır. Fonksiyonel programlama genel tanımı itibariyle; işlevsel bir tarzda programlama genellikle işlevleri bağımsız değişkenlerde ileterek, diğer işlevlerden döndürerek, daha sonra yürütmek için değişkenlere atayarak vb. değerler olarak kullanmayı içermektedir. Fonksiyonel programlama da kullanacağımız terimlere gelin birlikte bakalım.

Rust Closure

Rust programlama dilinde bir closure, bir fonksiyonu tanımlayan bir bloktur ve bu blok dışındaki değişkenlere erişebilir. Closure’lar, bir fonksiyonun belirli bir işlevi yerine getirmesi için geçici bir işlev oluşturmak istediğiniz durumlarda kullanışlıdır.

Rust closure’ları, birçok dilde bulunan anonim fonksiyonlara benzer. Rust closure’ları ayrıca lambda ifadeleri veya anonim fonksiyonlar olarak da adlandırılır. Rust dilinde closure’lar, |parametre| ifade formatında yazılır. Örneğin, bir closure, iki sayıyı toplayan bir fonksiyonu şu şekilde ifade edebilir.

let add_numbers = |a, b| a + b;
let sum = add_numbers(3, 5);
println!("Sum: {}", sum);

Rust closure’larının en büyük özelliklerinden biri, closure’ın dışındaki değişkenlere erişebilmesidir. Bu, closure’ların veri saklamak için kullanılabileceği anlamına gelir. Aşağıdaki örnekte, bir closure, dışarıdaki bir değişkene erişir ve değiştirir.

let mut x = 10;
let mut increment_x = || {
x += 1;
println!("x is now {}", x);
};
increment_x();
increment_x();

Rust closure’ları, verileri saklamak ve bir fonksiyonun içinde geçici işlevler oluşturmak için kullanışlıdır.

Rust Iterator

Rust dilinde Iterator kavramı veri koleksiyonları üzerinde tekrarlanabilir bir arayüz sağlayan yapılardır. Bu yapı yardımıyla bir koleksiyondaki her öğeyi sırayla işleyerek, veri işleme ve manipülasyon işlemleri kolayca gerçekleştirilir. Iterator’lar, for döngüleri ve diğer tekrarlanabilir yapılarda sıkça kullanılır.

Rust dilinde, Iterator trait’ı standart kütüphanede yer alır. Bu trait, koleksiyonları tekrarlanabilir hale getiren bir dizi yöntem içerir. Bu yöntemler, veri işleme ve filtreleme gibi farklı amaçlar için kullanılabilir.

let v = vec![1, 2, 3, 4, 5];

for item in v.iter() {
println!("{}", item);
}

Iterator’lar, filtreleme, haritalama, katlama (fold) ve zincirleme (chaining) gibi işlemler için de kullanılabilir. Aşağıdaki örnek, bir vektördeki tek sayıların toplamını bulmak için bir Iterator kullanır.

let v = vec![1, 2, 3, 4, 5];

let sum_of_odds = v.iter()
.filter(|&x| x % 2 != 0)
.fold(0, |sum, item| sum + item);

println!("{}", sum_of_odds);

Loop ve Iterator Kıyaslaması

Rust dilinde döngüsel program akışını kontrol etmek için loop ve Iterator kullanılmaktadır. Gelin bunların özelliklerine ve farklarına bakalım.

  • loop keywordü bir döngü oluşturarak belirli bir koşulun sağlanması veya belirli bir koşulun sağlanmaması durumunda, tekrarlanan bir kod bloğu yürütür. loop ifadesi, sınırsız döngüleri ve kesme ifadelerini kullanarak, döngüyü belirli koşullara bağlayabilir. loop ifadesi, özellikle belirli bir koleksiyonun öğeleri üzerinde döngü yapılmayacaksa veya bir belirli döngü sayısı belirlenmemişse kullanışlıdır.
  • Iterator bir koleksiyon üzerinde tekrarlanabilir bir arayüz sağlarlar. Iterator for döngüleri ve diğer tekrarlanabilir yapılarla birlikte kullanılarak, veri işleme ve manipülasyon işlemlerini kolaylaştırır. Iterator’lar, belirli bir koleksiyon üzerinde tekrarlanacaksa ve koleksiyon üzerinde filtreleme, haritalama veya katlama işlemleri yapılacaksa kullanışlıdır.
  • loop ifadesi ve Iterator‘lar, programlama gereksinimlerine bağlı olarak kullanılabilirler. loop ifadesi, koşulların belirgin olmadığı veya belirli bir koleksiyonun öğeleri üzerinde döngü yapılmayacaksa tercih edilebilirken, Iterator’lar, koleksiyon üzerinde veri işleme ve manipülasyon yapmak için daha uygun bir seçenek olabilir.

Sosyal medya hesaplarım: Twitter | Linkedin | Github | Youtube

--

--