Rust'ta erişim belirleyicileri (pub, pub(crate), pub(super)) veri ve fonksiyonlara erişimi kapsüllemek ve net bir şekilde kontrol etmek için bir mekanizma olarak ortaya çıkmıştır, C'de bu eksikti. Amaç, modülün elemanlarının görünürlük alanını sınırlamak ve kütüphane kullanıcılarına gerçekten ihtiyaç duydukları şeyleri vermektir.
Temel zorluk, yapı kendisi yayımlanmış (pub) olsa bile, alanlarının varsayılan olarak özel (private) kalmasıdır. Ayrıca, kapsüllemeyi bozmadan ve API'yi "delik" veya aşırı kapalı hale getirmeden iç içe yapı ve modüllere erişimi nasıl uygun bir şekilde organize edeceğiniz sorusu sıkça gündeme gelir.
Yapılar için alanlar için erişim belirleyicilerini ayrıca belirtmek gerekir. Otomatik olarak oluşturulan yapılar veya saklanan türler tasarlanırken, hangi kısımların dışarıya açılması gerektiğini ve hangilerinin gizli kalması gerektiğini dikkatlice düşünmek önemlidir. Bu, API'nin ve kod yapısının önemli bir parçasıdır.
Kod örneği:
mod outer { pub struct Exposed { pub field: i32, hidden: bool, } } // "field" alanının kullanımı mümkündür, // hidden – mümkün değil. let e = outer::Exposed { field: 42, hidden: true }; println!("{}", e.field); // e.hidden // derleme hatası
Ana özellikler:
Erişim belirleyicisi olarak pub olarak tanımlanmış bir yapı, mevcut modül dışından tamamen erişilemeyecek şekilde olabilir mi?
Evet, eğer yapıdaki tüm alanlar özel kalıyorsa, sadece ismiyle yayımlanmış olur — modül dışından bir örnek oluşturmak veya başlatmak mümkün değildir.
Bir yapının özel alanı kalıtım yoluyla veya başka bir şekilde, erişim belirleyici sistemini atlayarak erişilebilir mi?
Hayır, Rust'ta geleneksel kalıtım OOP dillerindeki gibi yoktur. Özel alanlara erişim, modül tarafından kontrol edilir ve önemli ölçüde sınırlıdır.
Erişim belirleyicileriyle özel bir modül olarak tanımlanan, ancak kamu alanlarına sahip olan bir yapı oluşturulursa ne olur?
Yapı ve alanları, ana modülün dışından görünmez olacaktır — erişim belirleyicileri ana modülün görünürlük alanını aşmaz.
** Negatif durum
Kullanıcı yapıyı pub olarak tanımladı ama tüm alanlar özel kaldı. Sonuç olarak, dış kod bunu düzgün bir şekilde kullanamaz, ne bir örnek oluşturabilir ne de değerleri alabilir.
Artılar:
Eksiler:
** Pozitif durum
Kullanıcı sadece gerekli alanları pub ile açtı ve hassas detayları özel bıraktı. Erişim için getter/setter'lar kullanıldı.
Artılar:
Eksiler: