Séparer les modules dans différents fichiers
Jusqu'à présent, tous les exemples de ce chapitre ont défini plusieurs modules dans un seul fichier. Quand les modules vont grossir, vous allez probablement vouloir déplacer leurs définitions dans un fichier séparé pour faciliter le parcours de votre code.
Prenons par exemple le code de l'encart 7-17 et déplaçons le module
salle_a_manger
dans son propre fichier src/salle_a_manger.rs en changeant le
fichier à la racine de la crate afin qu'il corresponde au code de l'encart 7-21.
Dans notre cas, le fichier à la racine de la crate est src/lib.rs, mais cette
procédure fonctionne aussi avec les crates binaires dans lesquelles le fichier à
la racine de la crate est src/main.rs.
Fichier : src/lib.rs
mod salle_a_manger;
pub use crate::salle_a_manger::accueil;
pub fn manger_au_restaurant() {
accueil::ajouter_a_la_liste_attente();
accueil::ajouter_a_la_liste_attente();
accueil::ajouter_a_la_liste_attente();
}
Et src/salle_a_manger.rs contiendra la définition du corps du module
salle_a_manger
, comme dans l'encart 7-22.
Fichier : src/salle_a_manger.rs
pub mod accueil {
pub fn ajouter_a_la_liste_attente() {}
}
Utiliser un point-virgule après mod salle_a_manger
plutôt que de créer un bloc
indique à Rust de charger le contenu du module à partir d'un autre fichier qui
porte le même nom que le module. Pour continuer avec notre exemple et déplacer
également le module accueil
dans son propre fichier, nous modifions
src/salle_a_manger.rs pour avoir uniquement la déclaration du module
accueil
:
Fichier : src/salle_a_manger.rs
pub mod accueil;
Ensuite, nous créons un dossier src/salle_a_manger et un fichier
src/salle_a_manger/accueil.rs qui contiendra les définitions du module
accueil
:
Fichier : src/salle_a_manger/accueil.rs
#![allow(unused)] fn main() { pub fn ajouter_a_la_liste_attente() {} }
L'arborescence des modules reste identique, et les appels aux fonctions de
manger_au_restaurant
vont continuer à fonctionner sans aucune modification,
même si les définitions se retrouvent dans des fichiers différents. Cette
technique vous permet de déplacer des modules dans de nouveaux fichiers au fur
et à mesure qu'ils s'agrandissent.
Remarquez que l'instruction pub use crate::salle_a_manger::accueil
dans
src/lib.rs n'a pas changé, et que use
n'a aucun impact sur quels fichiers
sont compilés pour constituer la crate. Le mot-clé mod
déclare un module, et
Rust recherche un fichier de code qui porte le nom dudit module.
Résumé
Rust vous permet de découper un paquet en plusieurs crates et une crate en
modules afin que vous puissiez réutiliser vos éléments d'un module à un autre.
Vous pouvez faire cela en utilisant des chemins absolus ou relatifs. Ces chemins
peuvent être importés dans la portée avec l'instruction use
pour pouvoir
utiliser l'élément plusieurs fois dans la portée avec un chemin plus court. Le
code du module est privé par défaut, mais vous pouvez rendre publiques des
définitions en ajoutant le mot-clé pub
.
Au prochain chapitre, nous allons nous intéresser à quelques collections de structures de données de la bibliothèque standard que vous pourrez utiliser dans votre code soigneusement organisé.