ProgrammationDéveloppeur backend Rust

Expliquez comment fonctionne le système de modules et la visibilité (pub, pub(crate), private) en Rust. Comment peut-on organiser un grand projet et éviter les conflits de noms ?

Réussissez les entretiens avec l'assistant IA Hintsage

Réponse

Le système de modules en Rust repose sur le mot-clé mod. Les modules permettent de diviser logiquement le code en fichiers et espaces de noms. Points clés :

  • Par défaut, tout est privé (private) dans le module actuel.
  • pub rend un élément public pour tout l'arbre des modules.
  • pub(crate) est accessible dans tout le crate (c'est-à-dire la bibliothèque/projet).
  • Les conflits de noms sont résolus par les espaces de noms : import explicite (use mod_name::item) et alias.

Pour les grands projets, il est recommandé d'utiliser un arbre de modules avec une description des interfaces publiques uniquement via lib.rs ou main.rs, le reste étant privé :

mod network; mod storage; pub use network::api;

Question piège

Si une structure est déclarée comme pub, sera-t-elle accessible pour d'autres crates ?

Réponse : Non, il n'est pas suffisant de marquer la struct comme pub. Il est également nécessaire qu'elle soit déclarée dans un module ouvert à l'extérieur du crate (pub mod), et les champs de la structure doivent être publics pour y avoir un accès direct.

Exemple :

mod foo { pub struct Bar; } // Bar n'est pas visible en dehors du crate, car foo est privé

Exemples d'erreurs réelles dues à une méconnaissance des subtilités du sujet


Histoire

Dans un projet avec une structure de modules complexe, une structure a été accidentellement déclarée pub, mais le module n'a pas été exporté comme pub. Plus tard, en essayant d'utiliser la structure d'un autre crate, une erreur d'inaccessibilité du type est survenue.

Histoire

Dans une grande bibliothèque, différents modules ont exporté des noms identiques (par exemple, types et errors). Lors d'une utilisation aveugle de use *, des conflits de noms sont apparus lors de la compilation. La solution consistait à ajouter des alias et à importer uniquement les éléments nécessaires.

Histoire

De nombreux débutants créent une structure pub, mais laissent les champs privés, ce qui rend leur initialisation impossible en dehors du module. En conséquence, une fonction d'un autre module ne pouvait pas créer la structure directement, ce qui a provoqué des erreurs jusqu'à ce que les champs ou les constructeurs soient rendus publics.