Nel linguaggio di programmazione Rust, il livello di accesso (visibilità) ai metodi e ai campi delle strutture è regolato da modificatori: pub, pub(crate), pub(super) e dall'assenza di modificatore (di default — privato).
Rust è stato progettato sin dall'inizio per garantire affidabilità e isolamento dei componenti. Il controllo dell'accesso alle parti interne delle strutture consente di incapsulare i dati e nascondere i dettagli di implementazione, mantenendo solo le interfacce necessarie pubbliche.
Gli sviluppatori spesso si trovano in situazioni in cui una struttura è pubblica, ma i suoi campi rimangono privati, oppure la pubblicità del campo è insufficiente a causa delle limitazioni di visibilità della struttura o del modulo stesso. È particolarmente complesso comprendere i livelli nidificati: una struttura annidata pubblica potrebbe non essere accessibile se il modulo contenitore è nascosto, e viceversa.
In Rust, i modificatori di accesso si applicano alle strutture, ai loro campi e metodi, nonché ai moduli e alle funzioni. Ci sono i seguenti livelli:
pub — rende l'elemento accessibile da qualsiasi luogo.pub(crate) — accessibile solo all'interno dell'attuale crate.pub(super) — accessibile solo dal modulo genitore.Esempio di codice:
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, } } }
Caratteristiche chiave:
Se una struttura è dichiarata come pub, è possibile accedere ai suoi campi senza modificatore da un altro modulo?
No, solo la struttura stessa diventa pubblica, ma i suoi campi rimangono privati all'interno del modulo. Per accedere al campo, deve essere dichiarato anche con pub.
Cosa succede se si dichiara una struttura come pub(crate), e un campo al suo interno come pub?
La visibilità è limitata dalla struttura stessa. Anche se il campo è pub, non è possibile accedervi al di fuori del crate, poiché la struttura non è accessibile.
pub(crate) struct Secret { pub data: i32, // pub non "passa attraverso" pub(crate) }
È possibile dichiarare una struttura pub all'interno di un modulo privato e accedervi dall'esterno?
No. La visibilità finale è determinata dal minimo tra la struttura e il modulo. Se il modulo è privato, anche le strutture e le funzioni al suo interno non sono visibili all'esterno di quel modulo.
Nel progetto, l'intera struttura è stata realizzata pubblica con campi aperti per accelerare lo sviluppo. In seguito, è diventato difficile mantenere la retrocompatibilità e controllare l'accesso ai campi, poiché venivano modificati direttamente.
Pro:
Contro:
Per la struttura pubblica sono stati implementati campi privati e metodi pubblici costruttori/accessori. La struttura è esportata solo al livello necessario del modulo.
Pro:
Contro: