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();
}

Encart 7-21 : Déclaration du module salle_a_manger dont le corps sera dans src/salle_a_manger.rs

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() {}
}

Encart 7-22 : Les définitions à l'intérieur du module salle_a_manger dans src/salle_a_manger.rs

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é.