Skip to content
Snippets Groups Projects
Commit bcbea0db authored by orestis.malaspin's avatar orestis.malaspin
Browse files

added mutableborrow

parent e613ed1a
No related branches found
No related tags found
No related merge requests found
Pipeline #
......@@ -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)
![Comme avec un cahier. Source [Wikipedia](https://upload.wikimedia.org/wikipedia/commons/9/9f/Se%C5%A1ity.JPG)](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)
![](figs/mem_vec_mut_borrowing.svg){#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".
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment