Acheter version papier

Rust

Fork me on GitHub

II. Spécificités de Rust

12. Multi-fichier

Il est maintenant grand temps de voir comment faire en sorte que votre projet contienne plusieurs fichiers. Vous allez voir, c'est très facile. Imaginons que votre programme soit composé des fichiers vue.rs et internet.rs. Nous allons considérer le fichier vue.rs comme le fichier "principal" : c'est à partir de lui que nous allons inclure les autres fichiers. Pour ce faire :

Runmod internet;

// le code de vue.rs

... Et c'est tout. Il n'y a rien besoin de changer dans la ligne de compilation non plus, rustc/Cargo se débrouillera pour trouver les bons fichiers tout seul. Veuillez noter que mod ne peut (et ne doit) être utilisé qu'une seule fois pour chaque fichier/dossier.

Si vous voulez utiliser un élément de ce fichier (on dit aussi module), faites tout simplement :

Runinternet::LaStruct {}
internet::la_fonction();

Si vous voulez éviter de devoir réécrire internet:: devant chaque struct/fonction/objet venant de internet.rs, il vous suffit de faire comme ceci :

Run// Cela veut dire que l'on inclut TOUT ce que contient ce module.
use internet::*;
// Ou comme ceci :
use internet::{LaStruct, la_fonction};

mod internet;

Et voilà, c'est à peu près tout ce qu'il y a besoin de savoir... Ou presque ! Si on veut utiliser un élément de vue.rs, on fera comme ceci :

Run// internet.rs

pub use super::LaStruct; // "super" voulant dire dans "le scope supérieur".

// ou bien:

pub use crate::LaStruct; // "crate" voulant dire "le module à la racine de la crate".

// Ou bien directement dans le code:

super::LaStruct;
crate::LaStruct;

Fini ? Presque ! Imaginons maintenant que vous vouliez mettre des fichiers dans des sous-dossiers : dans ce cas là, il vous faudra créer un fichier mod.rs dans le sous-dossier dans lequel vous devrez utiliser "pub use" sur les éléments que vous voudrez réexporter dans le scope supérieur (et n'oubliez pas d'importer les fichiers avec mod !).

Maintenant disons que vous créez un sous-dossier appelé "tests", voilà comment utiliser les éléments qui y sont :

Run// tests/mod.rs

pub use self::test1::Test1; // on réexporte Test1 directement
pub use self::test2::Test2; // idem

mod test1; // pour savoir dans quel fichier on cherche
mod test2; // idem
pub mod test3; // là on aura directement accès à test3

// dossier supérieur
// fichier lib.rs ou mod.rs
use tests::{Test1, Test2, test3}; // et voilà !

On peut résumer tout ça de la façon suivante :

  • Si vous êtes à la racine du projet, vous ne pouvez importer les fichiers/modules que dans le fichier "principal" (lib.rs si c'est une bibliothèque ou bien main.rs si c'est un binaire).
  • Si vous êtes dans un sous-dossier, vous ne pouvez les importer que dans le fichier mod.rs.
  • Si vous voulez qu'un module parent ait accès aux éléments du module courant ou d'un module enfant, il faudra que ces éléments soient réexportés.

Un dernier exemple plus concret :

 - le_project
    |
    |- lib.rs  <- le fichier principal
    |- un_fichier.rs
    |- module1
        |
        |- mod.rs
        |- file1.rs
        |- module2
            |
            |- mod.rs
            |- file1.rs

lib.rs

Run// On reexporte "UnElement" de un_fichier.rs
pub use un_fichier::UnElement;

// On reexporte "UnAutreElement" de module1/file1.rs
pub use module1::file1::UnAutreElement;

// On reexporte "Element" de module1/file1.rs
pub use module1::Element;
// On aurait pu le reexporter de cette facon aussi : "pub use module1::file1::Element;"

// on reexporte "UnDernierElement" de module1/module2/file1.rs
pub use module1::module2::file1::UnDernierElement;

mod un_fichier;
mod module1;

un_fichier.rs

Run// Vous avez besoin de le declarer public sinon les autres modules n'y auront
// pas accès.
pub struct UnElement;

module1/mod.rs

Runpub use file1::Element;

pub mod file1;
pub mod module2;

module1/file1.rs

Runpub struct Element;
pub struct UnAutreElement;

module1/module2/mod.rs

Runpub mod file1;

module1/module2/file1.rs

Runpub struct UnDernierElement;

Voilà qui clôture ce chapitre. Celui qui arrive est assez dur (si ce n'est le plus dur), j'espère que vous avez bien profité de la facilité de celui-ci ! Je vous conseille de bien souffler avant car il s'agit des... macros !