Soru Tarihçesi:
C++ veya Java gibi dillerde erişim belirteçleri (public, private, protected) sınıf üyelerinin görünürlüğünü sağlar, ancak oldukça esnektir — ve genellikle API'nin yanlış kullanılmasını önlemez. Rust'ta, erken sürümlerden itibaren, erişim kontrol sistemi sıkı ve açıktan modüler olacak şekilde tasarlanmıştır, böylece iç detayların dışarı sızması sınırlanmıştır.
Sorun:
Yapının dış koddan kısmen gizlenmesi sıklıkla gerekir: örneğin, alanlar özel olabilir ve yalnızca yöntemler dışarıya açılır. Erişimi sınırlamazsanız, yapının invariyanlarını istemeden bozulabilir (örneğin, iç bir Vec'i doğrudan açığa çıkararak). Yapıyı düşünmeden yayımlamak API'yi kırılgan hale getirir.
Çözüm:
Rust'ta her şey varsayılan olarak özel (private) olarak kabul edilir. pub anahtar kelimesi açıkça dışa aktarım için kullanılır: yapılar açıkça görünür ilan edilebilir, ancak alanlar gizli tutulabilir. Yöntemler ayrıca bireysel olarak açık veya özel olarak ilan edilir. Ayrıca, pub(crate) veya pub(super) gibi standart dışı formlar, erişim seviyesini hassas bir şekilde ayarlamak için kullanılabilir.
Kod örneği:
mod domain { pub struct User { pub name: String, age: u32, // özel alan } impl User { pub fn new(name: String, age: u32) -> Self { Self { name, age } } pub fn age(&self) -> u32 { self.age } } } use domain::User; fn main() { let u = User::new("Eve".to_string(), 24); println!("{} {}", u.name, u.age()); // u.age — erişim hatası! Alan modül dışında kapalı }
Anahtar Özellikler:
Bir yapıyı pub olarak tanımlayıp ama tüm alanlarını özel bırakabilir miyim? Modül dışından örneklerini nasıl yaratabilirim?
Evet. Genellikle böyle yapılır: yapı pub, alanlar özel, oluşturma yalnızca kamu yapıcılar (örneğin, pub fn new...) üzerinden yapılır.
Bir yapı pub struct Foo olarak ilan edildiğinde yapının alanı dış kodda görünür mü?
Hayır, varsayılan olarak her alan hâlâ özeldir — alan için açıkça pub belirtmek gerekir. pub struct yalnızca türü görünür hale getirir.
Enum için pub aynı şekilde çalışır mı?
Enum için pub, tüm varyantlara yayılır, ancak varyantlar içindeki ilişkili verilere (örneğin, Variant(value: T) içerisindeki alan) erişimi sağlamak için hâlâ açıkça pub belirtmek gerekir eğer içeriği erişilebilir yapmak istiyorsanız.
Bir kütüphanede, yapı pub struct Config olarak ilan edildi ve tüm alanları da pub olarak belirlendi — böylece kullanıcı "görebilirdi". Sonuç olarak, herhangi bir dış kod state'i keyfi olarak değiştirebilir, invariyanları ihlal edebilir ve beklenmedik bir noktada panic durumu oluşabilir.
Artıları:
Eksileri:
Yapı Config pub ve tüm alanlar özel. Ayarlama — yalnızca builder yöntemleri, varsayılan yapıcı veya setter/getter işlevleri aracılığıyla yapılabilir. Modül dışından invariyanlar bozulamaz.
Artıları:
Eksileri: