"Pub", genelden kasaya veya genelden modüle anlamına mı geliyor? [çiftleme]
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
pub
Anahtar 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
Ö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
static
beyan ise, türünde atıfta bulunulan maddeler kamuya açık olmalıdır.- Bir
fn
bildirim 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
struct
veyaenum
beyan ise, özellik sınırlarında ve alan türlerinde atıfta bulunulan maddelerpub
kamuya açık olmalıdır.- Bir
type
beyan ise, tanımında atıfta bulunulan maddeler kamuya açık olmalıdır.- Bu bir
trait
bildirim ise, üst niteliklerinde, tür parametrelerinin özellik sınırlarında ve yöntemlerinin imzalarında (fn
yukarıdaki duruma bakın ) atıfta bulunulan öğeler herkese açık olmalıdır.
Kısacası, özel tipte bir argümana sahip olduğu baz
için olmasına izin verilmez pub
. Böylece, eğer baz
olduğunu pub
o ebeveyn sağlayacak mod foo
yeniden ihracat için baz
yaparak 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 baz
buna 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.pub
Anahtar kelime de kullanılabiliruse
bir 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:
- 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.
- 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