Modules
Orestis Malaspinas
crate
)cargo new malibrairie --lib
.lib.rs
“à côté” du main.rs
(dans src/
).Pour accéder à ce qui se trouve dans la librairie on devra utiliser
extern crate ma_librairie;
Et appeler les fonctions, enums, …
ma_librairie::ma_fct();
ma_librairie::Mon_enum;
Dans le fichier lib.rs
on peut à présent créer un/deux/… modules contenant une fonction
mod mon_module { // on peut même insérer d'autres modules à l'intérieur
fn ma_fonction() {
unimplemented!(); // macro très pratique!
}
}
mod mon_autre_module {
fn ma_fonction() {
unimplemented!(); // macro très pratique!
}
}
Les fonctions mon_module::ma_fonction()
, mon_autre_module::ma_fonction()
auront une signification (et une fonctionalité différente).
On déclare les modules dans src/lib.rs
, on met le contenu dans src/mon_module.rs
mod mon_module;
mod mon_autre_module {
fn ma_fonction() {
unimplemented!(); // macro très pratique!
}
}
Équivalent à
mod mon_module {
// contenu de src/mon_module.rs
}
mod mon_autre_module {
fn ma_fonction() {
unimplemented!(); // macro très pratique!
}
}
On peut aller encore plus loin: src/lib.rs
mod mon_module {
fn ma_fonction() {
unimplemented!(); // macro très pratique!
}
mod mon_autre_module {
fn ma_fonction() {
unimplemented!(); // macro très pratique!
}
}
}
src/lib.rs
mod mon_module;
src/mon_module/mod.rs
fn ma_fonction() {
unimplemented!(); // macro très pratique!
}
mod mon_autre_module;
src/mon_module/mon_autre_module.rs
fn ma_fonction() {
unimplemented!(); // macro très pratique!
}
Avec la structure de module suivante
mod mon_module {
fn ma_fonction() {
unimplemented!(); // macro très pratique!
}
mod mon_autre_module {
fn ma_fonction() {
unimplemented!(); // macro très pratique!
}
}
}
On accède aux deux ma_fonction()
avec
mon_module::ma_fonction();
mon_module::mon_autre_module::ma_fonction();
Structure fichiers:
src/lib.rs
mod mon_module;
src/mon_module/mod.rs
fn ma_fonction() {
unimplemented!(); // macro très pratique!
}
src/main.rs
extern crate ma_librairie;
fn main() {
ma_librarie::mon_module::ma_fonction();
}
$ cargo build
Compiling ma_librairie v0.1.0 ($PATH/ma_librairie)
error[E0603]: module `mon_module` is private
--> src/main.rs:4:2
|
4 | ma_librairie::mon_module::ma_fonction();
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
error: aborting due to previous error
For more information about this error, try `rustc --explain E0603`.
error: Could not compile `ma_librairie`.
To learn more, run the command again with --verbose.
On contrôle la visibilité des modules avec pub
.
On a joute pub mon module
dans src/lib.rs
pub mod mon_module;
Par défaut les fonctions sont privées.
$ cargo build
Compiling ma_librairie v0.1.0 ($PATH/ma_librairie)
error[E0603]: function `ma_fonction` is private
--> src/main.rs:4:2
|
4 | ma_librairie::mon_module::ma_fonction();
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
error: aborting due to previous error
For more information about this error, try `rustc --explain E0603`.
error: Could not compile `ma_librairie`.
To learn more, run the command again with --verbose.
On a joute pub fn ma_fonction()
dans src/mon_module.rs
Compiling ma_librairie v0.1.0 ($PATH/ma_librairie)
Finished dev [unoptimized + debuginfo] target(s) in 1.28s
Quand plusieurs modules sont imbriqués, les appels sont longs: ma_librarie::mon_module::ma_fonction();
Avec use
, on peut se simplifier la vie src/main.rs
extern crate ma_librairie;
use ma_librairie::mon_module::ma_fonction;
fn main() {
ma_fonction();
}
Ou encore avec *
on peut rendre visible tout le module
extern crate ma_librairie;
use ma_librairie::mon_module::*;
fn main() {
ma_fonction();
}
pub
use
.