diff --git a/presentation/intro.md b/presentation/intro.md index b45ed01f54bd4355b7e3331202dd8046b949c0e7..be2d85206c39568214014ea4cee2590c2ced6658 100644 --- a/presentation/intro.md +++ b/presentation/intro.md @@ -127,18 +127,23 @@ Quel est le problème dans ce code? # Sûreté mémoire en Rust -## Ownership (1/2) +- En Rust, la sûreté en mémoire est garantie **à la compilation**. +- Il existe trois façons de posséder des données. + +# Owned data + +## Owner - Quand on est **propriétaire** des données, on peut faire ce qu'on veut avec: 1. Les lire. 2. Les modifier. 3. Les donner à quelqu'un d'autre. -## Ownership (2/2) +## Owner (2/2) ](https://upload.wikimedia.org/wikipedia/commons/9/9f/Se%C5%A1ity.JPG){#fig:mem_vec_str width=50%} -## Ownership en pratique (1/3) +## En pratique (1/3) <pre><code data-trim="hljs rust" class="lang-rust"> fn do_something(_notebook: Vec<&str>) { // _notebook prend l'ownership @@ -161,7 +166,7 @@ fn main() { Le transfert de l'ownership est complètement décidé à la **compilation**. -## Ownership en pratique (2/3) +## En pratique (2/3) Ce qui se passe en mémoire: @@ -173,7 +178,7 @@ Ce qui se passe en mémoire: **`notebook` est détruit à la fin de `do_something` et ne peut plus être réutilisé** -## Ownership en pratique (3/3) +## En pratique (3/3) En C++ une sytaxe similaire a un effet complètement différent @@ -195,7 +200,9 @@ void main() { } ``` -## Borrowing +# Shared reference + +## Emprunt immutable (1/2) Mais comment lire (ou modifier) le notebook et le réutiliser ensuite? @@ -220,7 +227,7 @@ fn main() { "Un peu" verbeux de faire comme cela. -## Borrowing +## Emprunt immutable (2/2) Solution: le propriétaire **prête** ses données. @@ -244,7 +251,7 @@ fn main() { } </code></pre> -## Borrowing en pratique (2/3) +## En pratique (1/2) Ce qui se passe en mémoire: @@ -252,7 +259,7 @@ Ce qui se passe en mémoire: ### Attention: un emprunt est **immutable** par définition! -## Borrowing en pratique (3/3) +## En pratique (2/2) ### Que se passe-t-il @@ -274,7 +281,7 @@ Ce qui se passe en mémoire: ::: {.column width="50%"} <pre><code data-trim="hljs rust" class="lang-rust"> fn main() { - let mut v = Vec::new(); // par défaut notebook est immutable + let mut v = Vec::new(); v.push("Test."); let elem = &v[0]; // référence @@ -282,9 +289,42 @@ fn main() { } </code></pre> ::: -:::::::::::::: +:::::::::::::: + +# Mutable reference + +## Emprunt mutable + +Le propriétaire **prête** ses données mais l'emprunteur peut les modifier. + +1. On crée une **mutable** référence vers les données (on peut les modifier). +2. On peut donner la référence. +3. Quand la référence sort de la portée elle est détruite, mais comme elle possède pas les données l'ownership est rendu aussi. + +. . . + +<pre><code data-trim="hljs rust" class="lang-rust"> + fn mut_borrow(notebook: &mut Vec<&str>) { // _notebook prend l'ownership de la référence vers un Vec + notebook.push("On peut modifier les données"); + // on peut lire les données contenues dans notebook et les modifier +} // la référence est détruite, les données sont rendues à notebook + +fn main() { + let mut notebook = Vec::new(); // par défaut notebook est immutable + + notebook.push("Il fait beau."); + notebook.push("Les oiseaux chantent."); + + mut_borrow(&mut notebook); // on crée une référence et on la passe à borrow + mut_borrow(&mut notebook); // on peut réutiliser notebook +} +</code></pre> + +## En pratique (1/2) +{#fig:mem_vec_borrowing width=70%} +La référence est **vérouillée** personne d'autre ne peut modifier ou lire les données. <!-- - `vector` et `string` sont alignés en mémoire. - références "light".