Rust

Any donation is very welcome
Fork me on GitHub

II. Spécificités de Rust

10. 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 de internet.rs, il vous suffit de faire comme ceci :

Runuse internet::*; // cela veut dire que l'on inclut TOUT ce que contient ce fichier
// ou comme ceci
use internet::{LaStruct, la_fonction};

// très important, le mod internet doit venir après !
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// vue.rs

pub use self::LaStruct;

// internet.rs

pub use super::LaStruct;

// ou bien

::LaStruct; // "::" voulant dire "dans le scope supérieur"

// ou bien encore

super::LaStruct; // super voulant aussi dire dans "le scope supérieur"

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".
  • 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 clotûre 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 !