W języku programowania Rust poziom dostępu (widoczności) do metod i pól struktur jest regulowany przez modyfikatory: pub, pub(crate), pub(super), a także braku modyfikatora (domyślnie — prywatnie).
Rust został zaprojektowany od początku, aby zapewnić niezawodność i izolację komponentów. Kontrola dostępu do wewnętrznych części struktur pozwala na enkapsulację danych i ukrycie szczegółów implementacji, zachowując tylko niezbędne interfejsy jako publiczne.
Programiści często napotykają sytuacje, w których struktura jest publiczna, ale jej pola pozostają prywatne, lub publiczność pola okazuje się niewystarczająca z powodu ograniczeń widoczności samej struktury lub modułu. Szczególnie trudno zrozumieć zagnieżdżone poziomy: publiczna struktura zagnieżdżona może być niedostępna, jeśli zawierający moduł jest ukryty, i odwrotnie.
W Rust modyfikatory dostępu są stosowane do struktur, ich pól i metod, jak również do modułów i funkcji. Istnieją następujące poziomy:
pub — czyni element dostępnym z dowolnego miejsca.pub(crate) — dostępny tylko wewnątrz bieżącego crate.pub(super) — dostępny tylko z rodzicielskiego modułu.Przykład kodu:
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, } } }
Kluczowe cechy:
Jeśli struktura jest zadeklarowana jako pub, a jej pola — bez modyfikatora, czy można uzyskać do nich dostęp z innego modułu?
Nie, tylko sama struktura staje się publiczna, ale jej pola pozostają prywatne w module. Aby uzyskać dostęp do pola, musi być ono również zadeklarowane jako pub.
Co się stanie, jeśli zadeklarujesz strukturę jako pub(crate), a pole wewnątrz niej — pub?
Widoczność jest ograniczona do samej struktury. Nawet jeśli pole jest pub, dostęp do niego poza crate jest niemożliwy, ponieważ struktura jest niedostępna.
pub(crate) struct Secret { pub data: i32, // pub nie "przechodzi" przez pub(crate) }
Czy można zadeklarować strukturę pub wewnątrz prywatnego modułu i uzyskać do niej dostęp z zewnątrz?
Nie. Ostateczna widoczność jest określona przez minimum pomiędzy strukturą a modułem. Jeśli moduł jest prywatny, struktury i funkcje w nim również nie są widoczne na zewnątrz tego modułu.
W projekcie cała struktura została zrobiona publiczna z otwartymi polami, aby przyspieszyć rozwój. Później było trudno utrzymać zgodność wstecz i kontrolować dostęp do pól, ponieważ były one zmieniane bezpośrednio.
Zalety:
Wady:
Dla publicznej struktury zrealizowano prywatne pola oraz publiczne metody-konstruktory/akcesory. Struktura jest eksportowana tylko na potrzebnym poziomie modułu.
Zalety:
Wady: