"Pub", genelden kasaya veya genelden modüle anlamına mı geliyor? [çiftleme]

Dec 15 2020

Bir alt modülden yöntemleri herkese açık hale getirmek için, bunları açıkça yeniden dışa aktarmanız veya alt modülün kendisini herkese açık hale getirmeniz gerekir:

mod foo {
    mod bar {
        pub fn baz() {}
    }
    pub use self::bar::baz;
}

Bu pub, bir şeyin sadece bir modül için halka açık olması gerektiğini belirtmek için kullanılan bir ipucu gibi görünüyor (çünkü bunu yapmamayı seçebilirsiniz)

Eğer dış bağlamda tanımlanan özel türü kullanırsanız denemek ve olmamalarına ve iç bağlamında kamu onu kapsayan ortak bir işlev yapmak Ama eğer bir hata alıyorum değil ihraç yeniden.

mod foo {
    struct Foo;

    mod bar {
        use super::Foo;

        pub fn baz(foo: Foo) {}
    }
}

sonuçlanır

error[E0446]: private type `Foo` in public interface
 --> src/lib.rs:7:9
  |
2 |     struct Foo;
  |     - `Foo` declared as private
...
7 |         pub fn baz(foo: Foo) {}
  |         ^^^^^^^^^^^^^^^^^^^^ can't leak private type

pubAnahtar kelimeyi kullanmanın deyimsel yolu nedir ? Gerçekte halka açık şeyler için mi ayrılmalıdır yoksa dahili modüller için kullanılabilir mi?

Yanıtlar

2 vallentin Dec 15 2020 at 04:06

Örneğinizin derlenememesinin nedeni, nihayetinde RFC'nin (136) böyle söylemesidir. (Ayrıca 22261 numaralı soruna bakın )

Herkese açık öğeler için hangi kısıtlamalar geçerlidir?

Çeşitli kamusal öğelerin kuralları aşağıdaki gibidir:

  • Bir staticbeyan ise, türünde atıfta bulunulan maddeler kamuya açık olmalıdır.
  • Bir fnbildirim ise, özellik sınırları, bağımsız değişken türleri ve dönüş türünde atıfta bulunulan öğeler herkese açık olmalıdır.
  • Bir structveya enumbeyan ise, özellik sınırlarında ve alan türlerinde atıfta bulunulan maddeler pubkamuya açık olmalıdır.
  • Bir typebeyan ise, tanımında atıfta bulunulan maddeler kamuya açık olmalıdır.
  • Bu bir traitbildirim ise, üst niteliklerinde, tür parametrelerinin özellik sınırlarında ve yöntemlerinin imzalarında ( fnyukarıdaki duruma bakın ) atıfta bulunulan öğeler herkese açık olmalıdır.

Kısacası, özel tipte bir argümana sahip olduğu baziçin olmasına izin verilmez pub. Böylece, eğer bazolduğunu pubo ebeveyn sağlayacak mod fooyeniden ihracat için bazyaparak pub use bar::baz;. Buna elbette izin verilmez ve bu, örneğin bir bütün olarak yasadışı olmasının nedenidir.

Bazıları daha önce pub fn bazbuna izin verilmesi gerektiğini ve bunun yerine ana modülün onu yeniden dışa aktarması durumunda bir derleme hatası vermeyi söylemişlerdir. Ancak, bu, tespit etmek için daha karmaşık statik analiz gerektirir ve sonuçta, RFC bunun yasa dışı olduğunu tanımladığı için yapılmamıştır.


puböğeye üst modül tarafından erişilebileceğini belirtir. Tüm modül ataları puböyleyse, o öğe sandık tarafından bir bütün olarak dışa aktarılır.

Anahtar kelime pub, herhangi bir modülü, işlevi veya veri yapısını harici modüllerin içinden erişilebilir hale getirir. pubAnahtar kelime de kullanılabilir usebir ad gelen bir tanımlayıcı yeniden ihraç beyanı.

- Rust Belgeleri

Bir öğenin genel veya özel olması fikriyle Rust, öğeye iki durumda erişime izin verir:

  1. Bir öğe herkese açıksa, o öğenin tüm üst modüllerine m'den erişebiliyorsanız, bazı m modüllerinden dışarıdan erişilebilir. Ayrıca, öğeyi yeniden dışa aktararak da potansiyel olarak adlandırabilirsiniz. Aşağıya bakınız.
  2. Bir öğe özelse, o öğeye mevcut modül ve onun soyundan gelenler tarafından erişilebilir.

- Rust Referansı - Görünürlük ve Gizlilik