In Rust wurden Sichtbarkeitsmodifikatoren (pub, pub(crate), pub(super)) als Mechanismus zur Kapselung und für eine klare Kontrolle des Zugriffs auf Daten und Funktionen eingeführt, was in C fehlte. Die Idee ist, den Sichtbarkeitsbereich von Modul-Elementen einzuschränken und Bibliotheksnutzern nur das zu geben, was tatsächlich benötigt wird.
Die wesentliche Schwierigkeit besteht darin, dass selbst wenn die Struktur selbst als öffentlich (pub) deklariert ist, ihre Felder standardmäßig privat bleiben. Oft stellt sich auch die Frage: Wie organisiert man den Zugriff auf verschachtelte Strukturen und Module sinnvoll, ohne die Kapselung zu verletzen und die API „löchrig“ oder umgekehrt zu restriktiv zu gestalten?
Für Strukturen müssen Zugriffsmodifikatoren explizit für die Felder angegeben werden. Bei der Gestaltung von automatisch generierten Strukturen oder gespeicherten Typen ist es besonders wichtig zu überlegen, welche Teile nach außen offen sein sollten und welche verborgen bleiben. Dies ist ein wichtiger Teil der API und der Code-Architektur.
Code-Beispiel:
mod outer { pub struct Exposed { pub field: i32, hidden: bool, } } // Der Zugriff auf das Feld "field" ist verfügbar, // hidden — nicht. let e = outer::Exposed { field: 42, hidden: true }; println!("{}", e.field); // e.hidden // Kompilierungsfehler
Wichtige Merkmale:
Kann eine als pub deklarierte Struktur außerhalb des aktuellen Moduls vollständig unzugänglich sein?
Ja, wenn alle Felder der Struktur privat bleiben, ist sie nur im Namen öffentlich — man kann außerhalb des Moduls keine Instanz der Struktur erstellen oder initialisieren.
Kann ein privates Feld einer Struktur durch Vererbung oder auf andere Weise zugänglich gemacht werden, die das System der Modifikatoren umgeht?
Nein, in Rust gibt es keine klassische Vererbung wie in OOP-Sprachen. Der Zugriff auf private Felder wird durch das Modul kontrolliert und ist erheblich eingeschränkt.
Was passiert, wenn man eine Struktur mit öffentlichen Feldern erstellt, das Modul jedoch privat deklariert?
Die Struktur und ihre Felder sind außerhalb des übergeordneten Moduls nicht sichtbar — die Modifikatoren gehen nicht über den Sichtbarkeitsbereich des übergeordneten Moduls hinaus.
** Negativer Fall
Der Benutzer hat eine pub-Struktur deklariert, aber alle Felder blieben privat. Infolgedessen kann der externe Code sie nicht richtig verwenden, weder eine Instanz erstellen noch Werte abrufen.
Vorteile:
Nachteile:
** Positiver Fall
Der Benutzer öffnete nur die notwendigen Felder über pub und ließ sensible Details privat. Zum Zugriff werden Getter/Setter verwendet.
Vorteile:
Nachteile: