- 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.
Rust
Rust, closure'ların parametre ve dönüş tiplerini genellikle kullanım şekline göre otomatik olarak çıkarır (type inference).
3.
Eğer bir closure'ı başka bir thread'e gönderiyorsanız (örneğin
Rust
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));
}
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)
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:| Trait | Açıklama |
Fn | Veriyi kısıtlama olmadan defalarca çağrılabilir. |
FnMut | Yakaladığı değeri değiştirebilir, defalarca çağrılabilir. |
FnOnce | Yakaladığı değeri tüketir, sadece bir kez çağrılabilir. |