diff --git a/modules.md b/modules.md index c8d6cd2ed60905e6cf82aa724f57eee134d54283..113953a1700c1a4020b550168bf0bb81be9fd599 100644 --- a/modules.md +++ b/modules.md @@ -151,4 +151,130 @@ sansfont: Sans Serif ```{.lang-rust} mon_module::ma_fonction(); mon_module::mon_autre_module::ma_fonction(); - ``` \ No newline at end of file + ``` + +# Visibilité + +## Modules (1/4) + +- Structure fichiers: + +- `src/lib.rs` + + ```{.lang-rust} + mod mon_module; + ``` +- `src/mon_module/mod.rs` + + ```{.lang-rust} + fn ma_fonction() { + unimplemented!(); // macro très pratique! + } + ``` + +- `src/main.rs` + + ```{.lang-rust} + extern crate ma_librairie; + + fn main() { + ma_librarie::mon_module::ma_fonction(); + } + ``` + +## Modules (2/4) + +- Par défaut les modules sont privés. + +``` +$ 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. +``` + +## Modules (3/4) + +- On contrôle la visibilité des modules avec `pub`{.rust}. + +- On a joute `pub mon module` dans `src/lib.rs` + + ```{.lang-rust} + 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. + ``` + + + +## Modules (4/4) + +- 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();`{.rust} + +- Avec `use`{.rust}, on peut se simplifier la vie `src/main.rs` + + ```{.lang-rust} + 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 + + ```{.lang-rust} + extern crate ma_librairie; + + use ma_librairie::mon_module::*; + + fn main() { + ma_fonction(); + } + ``` + +# Résumé + +- Les modules permettent de compartimenter le code. +- Par défaut tout ce qui se trouve dans un module est privé. +- On contrôle la visibilité avec `pub`{.rust} +- Si un item est public il peut être accédé depuis n'importe quel module parent. +- Si un item est privé il n'est accessible que depuis son parent direct et n'importe lequel de ses modules enfants. +- On peut rendre visible des sous-modules, ou des items avec `use`{.rust}. \ No newline at end of file