Dans le langage de programmation Rust, le niveau d'accès (visibilité) aux méthodes et aux champs des structures est régulé par des modificateurs : pub, pub(crate), pub(super), ainsi que par l'absence de modificateur (par défaut — privé).
Rust a été initialement conçu pour assurer la fiabilité et l'isolement des composants. Le contrôle d'accès aux parties internes des structures permet d'encapsuler les données et de cacher les détails d'implémentation, en gardant uniquement les interfaces nécessaires publiques.
Les développeurs se heurtent souvent à des situations où une structure est publique, mais ses champs demeurent privés, ou la publicité d'un champ s'avère insuffisante en raison des restrictions de visibilité de la structure ou du module lui-même. Comprendre les niveaux imbriqués est particulièrement complexe : une structure imbriquée publique peut être inaccessible si le module contenant est masqué, et vice versa.
En Rust, les modificateurs d'accès s'appliquent aux structures, à leurs champs et méthodes, ainsi qu'aux modules et fonctions. Les niveaux suivants existent :
pub — rend l'élément accessible de n'importe où.pub(crate) — accessible uniquement à l'intérieur du crate actuel.pub(super) — accessible uniquement depuis le module parent.Exemple de code :
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, } } }
Caractéristiques clés :
Si une structure est déclarée comme pub et que ses champs n'ont pas de modificateur, peut-on y accéder depuis un autre module ?
Non, seule la structure devient publique, mais ses champs restent privés au sein du module. Pour accéder à un champ, il doit également être déclaré avec pub.
Que se passe-t-il si une structure est déclarée comme pub(crate), mais qu'un champ à l'intérieur d'elle est pub ?
La visibilité est limitée par la structure elle-même. Même si le champ est pub, il est impossible d'y accéder en dehors du crate, car la structure n'est pas accessible.
pub(crate) struct Secret { pub data: i32, // pub ne "passe pas à travers" pub(crate) }
Peut-on déclarer une structure pub à l'intérieur d'un module privé et y accéder de l'extérieur ?
Non. La visibilité finale est déterminée par le minimum entre la structure et le module. Si le module est privé, les structures et fonctions qui y sont contenues ne sont pas visibles en dehors de ce module.
Dans un projet, toute la structure a été rendue publique avec des champs ouverts pour accélérer le développement. Par la suite, il est devenu difficile de maintenir la compatibilité ascendante et de contrôler l'accès aux champs, car ils étaient modifiés directement.
Avantages :
Inconvénients :
Pour une structure publique, des champs privés et des méthodes d'accès publiques sont implémentés. La structure est exportée uniquement au niveau requis du module.
Avantages :
Inconvénients :