Mutability: let vs let mut — Rust Neden Varsayılan Olarak Immutable?

  • 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 bir değişken tanımladığınızda (örneğin let x = 5;), bu değişken varsayılan olarak immutable (değiştirilemez) kabul edilir. Eğer değerini daha sonra değiştirmek isterseniz, açıkça let mut x = 5; diyerek mutability (değiştirilebilirlik) izni vermeniz gerekir.

Peki, Rust neden bizi bu kadar uğraştırıyor? Neden çoğu dildeki gibi her şey varsayılan olarak özgür değil?


1. Kod Okunabilirliği ve Tahmin Edilebilirlik​

Büyük bir projede çalıştığınızı düşünün. Bir değişkeni bir fonksiyona argüman olarak gönderiyorsunuz. Eğer o değişken varsayılan olarak mut değilse, o fonksiyonun değişkeninizin değerini "çaktırmadan" değiştirmeyeceğinden %100 emin olabilirsiniz.

  • Immutable (let): "Bu değer hayatı boyunca sabit kalacak."
  • Mutable (let mut): "Dikkat! Bu değer ileride değişebilir, takip et."
Bu ayrım, hata ayıklarken (debugging) bakmanız gereken yerleri inanılmaz derecede daraltır.


2. Bellek Güvenliği ve Concurrency (Eşzamanlılık)​

Rust'ın en büyük iddiası "veri yarışlarını" (data races) önlemektir. Veri yarışı, iki farklı thread'in (iş parçacığı) aynı anda aynı veriye erişip, en az birinin bu veriyi değiştirmeye çalışmasıyla oluşur.

Eğer veriler varsayılan olarak değiştirilemez ise, binlerce thread aynı veriyi güvenle okuyabilir. Rust, "aynı anda ya birçok okuyucuya izin veririm ya da sadece tek bir yazıcıya" kuralını (Aliasing) derleme aşamasında bu sayede kontrol eder.


3. let vs let mut: Örnek Kullanım​

Farkı kod üzerinde görelim:

Hata Veren Kod (Immutable):

Rust

fn main() {
let x = 5;
x = 6; // Derleyici Hatası: cannot assign twice to immutable variable `x`
}
Doğru Kod (Mutable):

Rust

fn main() {
let mut x = 5;
println!("İlk değer: {}", x);
x = 6; // Başarıyla değişti
println!("Yeni değer: {}", x);
}

4. Shadowing (Gölgeleme) - Farklı Bir Yaklaşım​

Bazen bir değişkenin değerini değiştirmek değil, onu "dönüştürmek" istersiniz. Rust burada Shadowing özelliğini sunar. Aynı ismi tekrar let ile tanımlayarak eski değişkeni "gölgeleyebilirsiniz".

Rust

let mesafe = "42"; // string tipi
let mesafe: i32 = mesafe.parse().expect("Sayı değil!"); // Artık tam sayı (i32)
Shadowing ile mut arasındaki fark şudur: Shadowing kullandığınızda aslında yeni bir değişken oluşturursunuz ve değişkenin tipini değiştirebilirsiniz. mut kullandığınızda ise sadece mevcut değer üzerinde oynama yapabilirsiniz, tipi değiştiremezsiniz.


5. Performans Etkisi​

"Varsayılan olarak immutable olmak kodu yavaşlatır mı?" sorusunun cevabı hayırdır. Aksine, derleyici (LLVM), bir değerin asla değişmeyeceğini bildiğinde kodu çok daha agresif bir şekilde optimize edebilir. Bu, Rust'ın "sıfır maliyetli soyutlamalar" felsefesinin bir parçasıdır.


Özet: Neden let?​

  1. Güvenlik: Yanlışlıkla veri değiştirmeyi önler.
  2. Hız: Derleyici optimizasyonlarını kolaylaştırır.
  3. Paralellik: Thread-safe (iş parçacığı güvenli) kod yazımını kolaylaştırır.
Değişkenlerin sadece değerini değil, tipini de sıkı sıkıya kontrol eden Rust'ın "Veri Tipleri" dünyasına dalmaya hazır mısınız?
 
Geri
Üst