Rust'ta erişim belirteçleri, modül bileşenlerine (yapılar, fonksiyonlar, sabitler vb.) erişimi yönetir. Varsayılan olarak, bir modülde tanımlanan her şey özeldir (yalnızca bu modül içinde erişilebilir). Özel belirteçler vardır:
pub: bileşeni genel erişime açık hale getirir (herhangi bir dış modülden görülebilir).pub(crate): görünürlük, mevcut crate (paket) ile sınırlıdır.pub(super): görünürlük, üst modül ile sınırlıdır.pub(in path): görünürlük, belirli bir yol ile sınırlıdır.Örnek:
mod foo { pub struct Bar { pub x: i32, // alan her yerde erişilebilir y: i32, // alan özel } pub(crate) fn crate_fn() {} pub(super) fn super_fn() {} fn private_fn() {} }
C++ veya Java gibi dillerden en büyük fark, protected için ayrı bir seviye olmamasıdır ve erişim, sınıf hiyerarşisi yerine modüller/yollar düzeyinde sıkı bir şekilde kontrol edilir.
Soru: Eğer bir yapı pub struct Foo olarak tanımlanmışsa, onun özel alanları aynı projenin başka bir modülünde erişilebilir mi?
Çoğu kişi şöyle cevap verir: Evet, çünkü yapı açıktır.
Doğru cevap: Hayır, yalnızca yapı (Foo) görünür hale gelir, alanlar yalnızca alanlar da pub belirteci ile tanımlandıysa görünürdür. pub belirteci olmayan alanlar, yapı açık olsa bile özel kalır.
Örnek:
mod foo { pub struct Bar { pub x: i32, y: i32, } } fn main() { let bar = foo::Bar { x: 1, y: 2 }; // Hata: `y` alanı erişilebilir değil }
Hikaye
Büyük bir projede yapıyı pub ile kamuya açık olarak ihraç ettiler, ancak alanları varsayılan olarak özel yaptılar. Diğer modüller doğrudan yapı örnekleri oluşturamaz hale geldi ve tek çözüm, ek yapıcılar yazmak veya gerekli alanları pub olarak tanımlamak oldu. Bu, API'nin nihai tamamlanmasına kadar geçici bir başarısızlığa neden oldu.
Hikaye
Bir geliştirici, bu kütüphaneyi kullanan ikili projelerden erişim bekleyerek işlevler için yalnızca pub(crate) kullandı. Ancak bu tür işlevler dış ikili crate'de erişilemez hale geldi ve entegrasyonda sorunlara yol açtı.
Hikaye
Bir API sunucusuna yönelik eklentilerden birinde, yapılar için pub(super) kullanıldı, ancak zamanla diğer modüllerden erişim ihtiyacı doğdu; görünürlük ayarları nedeniyle, kapsüllemeyi ihlal etmeden gerekli görünüm alanını sağlamak için birçok yerde modüllerin köklü bir şekilde yeniden yazılması gerekti.