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?
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.
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);
}
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.
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."
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?
- Güvenlik: Yanlışlıkla veri değiştirmeyi önler.
- Hız: Derleyici optimizasyonlarını kolaylaştırır.
- Paralellik: Thread-safe (iş parçacığı güvenli) kod yazımını kolaylaştırır.