In der Programmiersprache Rust wird der Zugriffslevel (Sichtbarkeit) auf Methoden und Felder von Strukturen durch Modifikatoren wie pub, pub(crate), pub(super) sowie durch das Fehlen eines Modifikators (standardmäßig privat) geregelt.
Rust wurde von Grund auf für Zuverlässigkeit und Isolation von Komponenten entwickelt. Die Kontrolle des Zugriffs auf interne Teile von Strukturen ermöglicht es, Daten zu kapseln und Implementierungsdetails zu verbergen, während nur die benötigten Schnittstellen öffentlich bleiben.
Entwickler stehen häufig vor Situationen, in denen eine Struktur öffentlich ist, aber ihre Felder privat bleiben oder die Öffentlichkeit eines Feldes aufgrund von Sichtbarkeitsbeschränkungen der Struktur oder des Moduls nicht ausreicht. Besonders komplex ist das Verständnis von eingebetteten Ebenen: Eine öffentliche eingebettete Struktur kann unzugänglich sein, wenn das enthaltende Modul verborgen ist, und umgekehrt.
In Rust werden Zugriffsmodifikatoren auf Strukturen, deren Felder und Methoden sowie auf Module und Funktionen angewendet. Es gibt folgende Ebenen:
pub – macht das Element von überall zugänglich.pub(crate) – nur innerhalb des aktuellen Crates zugänglich.pub(super) – nur aus dem übergeordneten Modul zugänglich.Beispielcode:
mod outer { pub struct PublicStruct { pub field: u32, hidden: u32, } pub(crate) struct CrateStruct { pub value: i32, } struct PrivateStruct { pub secret: i32, } pub mod inner { pub(super) struct SuperStruct { pub super_field: u8, } } }
Wichtige Besonderheiten:
Wenn eine Struktur als pub deklariert ist, ihre Felder jedoch ohne Modifikator, kann man von einem anderen Modul darauf zugreifen?
Nein, nur die Struktur selbst wird öffentlich, aber ihre Felder bleiben privat im Modul. Um auf ein Feld zuzugreifen, muss es ebenfalls mit pub deklariert werden.
Was passiert, wenn eine Struktur als pub(crate) deklariert ist, das Feld darin jedoch pub ist?
Die Sichtbarkeit wird durch die Struktur selbst eingeschränkt. Selbst wenn das Feld pub ist, kann man nicht außerhalb des Crates darauf zugreifen, da die Struktur nicht verfügbar ist.
pub(crate) struct Secret { pub data: i32, // pub "geht nicht durch" pub(crate) }
Kann man eine Struktur pub innerhalb eines privaten Moduls deklarieren und von außen darauf zugreifen?
Nein. Die endgültige Sichtbarkeit wird durch das Minimum zwischen der Struktur und dem Modul bestimmt. Wenn das Modul privat ist, sind die Strukturen und Funktionen darin auch außerhalb dieses Moduls nicht sichtbar.
Im Projekt wurde die gesamte Struktur öffentlich gemacht mit geöffneten Feldern, um die Entwicklung zu beschleunigen. Später wurde es schwierig, die Abwärtskompatibilität zu wahren und den Zugriff auf Felder zu kontrollieren, da sie direkt geändert wurden.
Vorteile:
Nachteile:
Für die öffentliche Struktur wurden private Felder und öffentliche Konstruktor-/Zugriffsmethoden implementiert. Die Struktur wird nur auf dem benötigten Niveau des Moduls exportiert.
Vorteile:
Nachteile: