ProgramlamaRust backend geliştirici

Değişmez (immutable) ve değiştirilebilir (mutable) veri yapılarıyla çalışma yöntemlerini Rust'ta açıklayın ve ne zaman değiştirilebilirliğe ihtiyaç duyulduğunu belirtin. Bu konuda pratik sınırlamalar nelerdir ve bunlar nasıl akıllıca aşılabilir?

Hintsage yapay zeka asistanı ile mülakatları geçin

Cevap.

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

Kandırmaca Soru.

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

Konuyla ilgili bilmediğin için yapılan gerçek hata örnekleri.


Hikaye

Büyük bir projede, geliştiricilerden biri, alanı mut ile 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>> veya RwLock<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ı mut olarak 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.