@@ -127,7 +127,7 @@ Quel est le problème dans ce code?
# Sûreté mémoire en Rust
## Ownership (1/1)
## Ownership (1/2)
- Quand on est **propriétaire** des données, on peut faire ce qu'on veut avec:
1. Les lire.
...
...
@@ -138,7 +138,7 @@ Quel est le problème dans ce code?
](https://upload.wikimedia.org/wikipedia/commons/9/9f/Se%C5%A1ity.JPG){#fig:mem_vec_str width=50%}
## Ownership en pratique
## Ownership en pratique (1/3)
<pre><codedata-trim="hljs rust"class="lang-rust">
fn do_something(_notebook: Vec<&str>) { // _notebook prend l'ownership
...
...
@@ -161,7 +161,7 @@ fn main() {
Le transfert de l'ownership est complètement décidé à la **compilation**.
## Ownership en pratique
## Ownership en pratique (2/3)
Ce qui se passe en mémoire:
...
...
@@ -173,7 +173,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
## Ownership en pratique (3/3)
En C++ une sytaxe similaire a un effet complètement différent
...
...
@@ -195,6 +195,37 @@ void main() {
}
```
## Borrowing
Mais comment lire (ou modifier) le notebook et le réutiliser ensuite?
<pre><codedata-trim="hljs rust"class="lang-rust">
fn do_something(_notebook: Vec<&str>) -> Vec<&str> { // _notebook prend l'ownership
// Do something with the library
notebook
} // _notebook est détruit et ses données aussi
fn main() {
let mut notebook = Vec::new(); // par défaut notebook est immutable
notebook.push("Il fait beau.");
notebook.push("Les oiseaux chantent.");
notebook = do_something(notebook); // ownership transféré à do_something et on le retourne
notebook = do_something(notebook); // on peut le réutiliser
}
</code></pre>
. . .
"Un peu" verbeux de faire comme cela.
## Borrowing
Solution: le propriétaire **prête** les données dont il est propriétaire.
<!-- - `vector` et `string` sont alignés en mémoire.