ProgramlamaRust Backend Geliştirici

Modüllerin (modules) nasıl çalıştığını ve görünürlüğü (pub, pub(crate), private) Rust'da açıklayın. Büyük bir projeyi nasıl organize edebilir ve isim çakışmalarından kaçınabilirsiniz?

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

Cevap

Rust'taki modül sistemi mod anahtar kelimesi etrafında inşa edilmiştir. Modüller, kodun dosyalar ve isim alanları (namespace) etrafında mantıksal olarak bölünmesini sağlar. Temel noktalar:

  • Varsayılan olarak, her şey mevcut modül içinde özel (private) olarak kabul edilir.
  • pub, öğeyi tüm modül ağacı için kamuya açık hale getirir.
  • pub(crate), tüm crate içinde erişilebilir (yani, kütüphane/proje).
  • İsim çakışmaları, isim alanlarıyla çözülür: açık içe aktarma (use mod_name::item) ve takma adlar (aliases) ile.

Büyük projeler için, lib.rs veya main.rs aracılığıyla yalnızca kamuya açık arayüzlerin tanımlandığı bir modül ağacı kullanılması önerilir, geri kalan kısmı özel kalır:

mod network; mod storage; pub use network::api;

Kandırmaca Sorusu

Eğer bir yapı pub olarak tanımlanmışsa, diğer crate'ler için erişilebilir hale gelir mi?

Cevap: Hayır, bir yapıyı sadece pub olarak işaretlemek yeterli değildir. Ayrıca, yapının dışa açık bir crate'de (pub mod) tanımlanması gerekir ve yapının alanlarının (fields) da kamuya açık olması gerekir, böylece onlara doğrudan erişim sağlanabilir.

Örnek:

mod foo { pub struct Bar; } // Bar, foo özel olduğu için dışarıdan görünmez

Konuyla İlgili Gerçek Hata Örnekleri


Hikaye

Karmaşık bir modül yapısına sahip bir projede, yapı yanlışlıkla pub olarak tanımlandı, ancak modül pub olarak dışa aktarılmadı. Daha sonra bir başka crate'den bu yapıyı kullanmaya çalıştılar - türün erişilemez olduğu hatasını aldılar.

Hikaye

Büyük bir kütüphanede, farklı modüller aynı isimleri (örneğin, types ve errors) dışa aktardılar. use * kullanımı sırasında derleme aşamasında isim çakışmaları oluştu. Çözüm, takma adlar eklemek ve yalnızca gerekli öğeleri içe aktarmak oldu.

Hikaye

Pek çok yeni başlayan, bir yapıyı pub olarak oluşturuyor ancak alanlarını private bırakıyor, bu da modül dışındaki yapıların başlatılmasını imkansız hale getiriyor. Sonuç olarak, başka bir modülden bir fonksiyon, bu yapıyı doğrudan oluşturamıyordu, bu da alanlar veya yapıcılar (constructors) kamuya açık hale getirilene kadar hatalara neden oldu.