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