ProgramlamaBackend geliştirici

Rust'ta erişim belirteçleri (pub, pub(crate), pub(super)) nasıl uygulanır ve diğer dillerdeki belirteçlerden ne farkı vardır? Modül bileşenlerinin görünürlüğünün yanlış ayarlanması durumunda hangi sorunlar ortaya çıkabilir?

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

Cevap.

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.

Aldatıcı soru.

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 }

Konunun inceliklerinden habersizliğin gerçek hata örnekleri.


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.