W Rust modyfikatory widoczności (pub, pub(crate), pub(super)) pojawiły się jako mechanizm do enkapsulacji i ścisłej kontroli dostępu do danych i funkcji, czego brakowało w C. Idea polega na ograniczeniu zakresu widoczności elementów modułu i udostępnieniu użytkownikom biblioteki tylko tego, co jest naprawdę potrzebne.
Kluczową trudnością jest to, że nawet jeśli sama struktura jest zadeklarowana jako publiczna (pub), jej pola domyślnie pozostają prywatne. Często pojawia się również pytanie: jak właściwie zorganizować dostęp do zagnieżdżonych struktur i modułów, nie naruszając enkapsulacji i nie czyniąc API "dziurawym" lub, przeciwnie, zbyt zamkniętym.
Dla struktur należy osobno określić modyfikatory dostępu dla pól. Projektując struktury automatycznie generowane lub przechowywane typy, warto szczególnie dokładnie przemyśleć, które części powinny być otwarte na zewnątrz, a które ukryte. To ważna część API i architektury kodu.
Przykład kodu:
mod outer { pub struct Exposed { pub field: i32, hidden: bool, } } // Użycie pola "field" jest dostępne, // hidden — nie jest. let e = outer::Exposed { field: 42, hidden: true }; println!("{}", e.field); // e.hidden // błąd kompilacji
Kluczowe cechy:
Czy struktura zadeklarowana jako pub może być w pełni niedostępna poza aktualnym modułem?
Tak, jeśli wszystkie pola struktury pozostają prywatne, jest publiczna tylko z nazwy — nie można utworzyć lub zainicjować instancji struktury poza modułem.
Czy prywatne pole struktury może stać się dostępne przez dziedziczenie lub w inny sposób, omijając system modyfikatorów?
Nie, w Rust nie ma klasycznego dziedziczenia jak w językach OOP. Dostęp do prywatnych pól jest kontrolowany przez moduł i jest znacznie ograniczony.
Co się stanie, jeśli stworzysz strukturę z publicznymi polami, ale zadeklarujesz moduł jako prywatny?
Struktura i jej pola nie będą widoczne poza macierzystym modułem — modyfikatory nie wychodzą poza zakres widoczności macierzystego modułu.
** Negatywny przypadek
Użytkownik zadeklarował strukturę pub, ale wszystkie pola pozostały prywatne. W rezultacie kod zewnętrzny nie może jej prawidłowo używać, ani utworzyć instancji, ani uzyskać wartości.
Zalety:
Wady:
** Pozytywny przypadek
Użytkownik otworzył tylko niezbędne pola przez pub, pozostawiając wrażliwe szczegóły prywatnymi. Dostęp uzyskuje się za pomocą getterów/setterów.
Zalety:
Wady: