Rust'ta veri yapıları varsayılan olarak değişmezdir. Bu, mut anahtar kelimesi olmadan tanımlanan herhangi bir değişkenin veya referansın, başlatıldıktan sonra değiştirilemeyeceği anlamına gelir.
let mut value = 10; // değiştirilebilir değişken value += 5; let value2 = 10; // değişmez değişken // value2 += 5; // derleme hatası: değişmez değişkene iki kez atanamaz
Aynı mantık yapıların alanlarına da uygulanır:
struct Point { x: i32, y: i32 } let mut pt = Point { x: 1, y: 2 }; pt.x = 5; // TAMAM, çünkü pt `mut` olarak tanımlandı
Ancak değiştirilebilirlik yalnızca değişkenin „üst düzeyine“ etki eder: Eğer bir yapı değişmez bir referansla saklanıyorsa, yapının içindeki veriler de, yapı içinde mut olarak tanımlansa bile, değiştirilemez.
Sınırlamaları aşmanın bir diğer yolu da, RefCell<T> gibi özel türler veya atomik kapsayıcılar kullanmaktır. Bu, değişmez görünümdeki kapsayıcıların içindeki verileri "içsel değiştirilebilirlik" (interior mutability) ile değiştirmenizi sağlar; örneğin:
use std::cell::RefCell; struct Counter { count: RefCell<i32>, } let counter = Counter { count: RefCell::new(0) }; *counter.count.borrow_mut() += 1; // güvenli, `mut` olmadan
Soru: Eğer bir değişken mut olarak tanımlanmamışsa, ancak alan açıkça mut olarak tanımlanmışsa, yapı alanının değeri değiştirilebilir mi?
Tipik yanıt: Evet, eğer alan mut olarak tanımlanmışsa, onu değiştirebilirsiniz.
Doğru yanıt: mut anahtar kelimesi yapı alanı tanımında kullanılamaz. Değiştirilebilirlik yalnızca değişkenin kendisine veya elde edilen referansa aittir. Yapı alanını değiştirmek için ya değişkenin mut olarak tanımlanması ya da „içsel değiştirilebilirlik“ türlerinin kullanılması gerekir (örneğin, RefCell).
Örnek:
struct Foo { val: i32 } // alan `mut` olmadan tanımlandı let mut foo = Foo { val: 1 }; foo.val = 2; // TAMAM let foo2 = Foo { val: 3 }; foo2.val = 4; // hata! değişken değiştirilebilir değil
Hikaye
Büyük bir projede, geliştiricilerden biri, alanı
mutile tanımlamanın gerekli değiştirilebilirliği sağlayacağını düşündüğü için bir yapının alanını değiştirmeye çalıştı. Bu, derlenemedi ve yeniden yapılandırma süreci birkaç saat sürdü; çünkü ona değiştirilebilirliğin bir değişkenin sahipliğiyle ilgili bir özellik olduğunu açıklamaları gerekti.
Hikaye
Çoklu iş parçacığı ile ilgili bir projede, veri erişim kontrol mantığı, küresel statik bir yapıda tutuluyordu.
RefCell'ın içsel değiştirilebilirlik özelliklerini bilmeyen ekip,Arc<Mutex<T>>veyaRwLock<T>ile basit bir çözüm yerine karmaşık kilitleme ve yarış koşulları mekanizmaları yazıyordu.
Hikaye
Bir geliştirici, fonksiyonun imzasında argümanı
mutolarak tanımlamayı unuttu ve bu nedenle fonksiyon, geçirilen yapıyı değiştiremedi; bu da hatanın yalnızca üretimde ortaya çıkmasına neden oldu (veriler fonksiyon çağrısından sonra güncellenmedi). Varsayılan olarak, geçişin değişmez bir referansla yapıldığını bilmek, erken aşamalarda hata almaktan kurtulmasına yardımcı olabilirdi.