From a2253ffb6b4fbfd27e167434b0fa8b5e56f5e1b9 Mon Sep 17 00:00:00 2001 From: Orestis Malaspinas <orestis.malaspinas@hesge.ch> Date: Wed, 10 Oct 2018 15:41:19 +0200 Subject: [PATCH] =?UTF-8?q?ajout=20visibilit=C3=A9=20avec=20pub=20et=20use?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- modules.md | 128 ++++++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 127 insertions(+), 1 deletion(-) diff --git a/modules.md b/modules.md index c8d6cd2..113953a 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 -- GitLab