@@ -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><codedata-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><codedata-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><codedata-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