Closure: İsimsiz Fonksiyonlar ve Çevresel Veri Yakalama

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

irfo

Moderatör
Top Poster Of Month
Katılım
7 Ocak 2026
Mesajlar
234
Tepkime puanı
2
Puanları
18
Rust'ta Closure'lar (Kapanışlar), bir değişkene atanabilen veya başka fonksiyonlara parametre olarak gönderilebilen isimsiz (anonymous) fonksiyonlardır.
Normal fonksiyonlardan en büyük farkı, tanımlandıkları kapsamdaki (scope) değişkenleri "yakalayabilme" (capture) yetenekleridir.

1. Sözdizimi (Syntax)​

Closure'lar, parametrelerini parantez () yerine dik çizgiler || arasında alır.
Rust
Kod:
// Normal Fonksiyon
fn topla_v1(a: i32, b: i32) -> i32 { a + b }

fn main() {
    // Closure
    let topla_v2 = |a: i32, b: i32| a + b;

    println!("{}", topla_v2(5, 3));
}
Rust, closure'ların parametre ve dönüş tiplerini genellikle kullanım şekline göre otomatik olarak çıkarır (type inference).

2. Çevreyi Yakalamak (Capturing the Environment)​

Closure'lar dışarıdaki değişkenlere üç farklı şekilde erişebilir. Bu erişim şekli, closure'ın hangi Fn Trait'ini uygulayacağını belirler:
  • Ödünç Alarak (Borrowing): Değişkeni sadece okur. (Fn)
  • Değiştirerek (Mutable Borrowing): Dışarıdaki değişkeni günceller. (FnMut)
  • Sahipliği Alarak (Moving): Değişkeni tamamen kendi içine taşır. (FnOnce)
Rust
Kod:
let x = 4;
let esit_mi = |z| z == x; // x'i ödünç alır (Fn)

let mut sayac = 0;
let mut artir = || sayac += 1; // sayac'ı mutable ödünç alır (FnMut)

3. move Anahtar Kelimesi​

Eğer bir closure'ı başka bir thread'e gönderiyorsanız (örneğin thread::spawn ile), dışarıdaki verinin sahipliğini closure içine zorla taşımak için move kullanılır.
Rust
Kod:
let veri = vec![1, 2, 3];

let handle = std::thread::spawn(move || {
    println!("Vektör artık thread içinde: {:?}", veri);
});
// veri burada kullanılamaz, sahipliği taşındı.

4. Closure'lar ve Fonksiyon Parametreleri​

Closure'ları fonksiyonlara parametre olarak geçerken hangi trait'i kullanacağınızı seçmeniz gerekir:
TraitAçıklama
FnVeriyi kısıtlama olmadan defalarca çağrılabilir.
FnMutYakaladığı değeri değiştirebilir, defalarca çağrılabilir.
FnOnceYakaladığı değeri tüketir, sadece bir kez çağrılabilir.
 
Geri
Üst