Le concept de “propriétaire” ou “ownership” en Rust
Vous venez de commencer le Rust, et tout ce que vous écrivez ne compile pas ? Bienvenu dans le monde Rust, ou le compilateur fait la loi pour votre bien !
Quand on vient du monde merveilleux des langages a ramasse miette (Garbage collector), on oublie assez facilement qu’en dessous, c’est une armée de pointeur qui se balade d’adresse en adresse, et qu’un superviseur (le GC) est responsable de faire respecter la loi (libérer l’espace).
Quand on a fait un peu de C/C++, on se souvient bien qu’il fallait libérer les différents pointeurs, est ce que pour autant, a l’exécution on était protéger de “fuite de mémoire”: non ! Sans pouvoir retrouver le lien, Microsoft indiquait que 60% de ses bogues étaient dus a des fuites de mémoire !
Okay, Rust a fait le choix de vous filer les clés du camion (pas de garbage collector, et pas d’api pour libérer vous même la mémoire); tout en vous en filant un super GPS (le compilateur) qui en plus de vous indiquer le bon chemin (les messages d’erreurs sont particulièrement lisible et compréhensible), vous bloque lorsque vous faites des opérations dangereuses !
Le concept de propriétaire est relativement simple au sens Rust :
- Chaque valeur est associé à une variable dit son “propriétaire”
- Une valeur ne peut pas avoir plus d’un propriétaire (d’où la notion de transfert de propriété)
- Quand une variable (ie un propriétaire) sort du scope (une fonction par exemple), sa valeur est supprimée (ou libéré)
La notion de propriétaire commence via une assignation:
La notion de propriétaire implique aussi qu’en dehors de son scope, sa valeur n’existe plus :
Ré-assigné une valeur déplace la propriété (ce qu’on appel un move) :
Dans le cas d’un type primitif (comme ci-dessous), ce n’est pas tout a fait un “move” mais plus une copie :
En synthèse :
- Je ré-assigne une valeur primitive, je crée alors une copie
- Je ré-assigne une valeur non primitive, je déplace alors la propriété
Le “Borrowing” ou “Transfert” qui permet de prêter une valeur sans perdre la propriété
Je prête une valeur à une ou plusieures variables, mais elle ne peut pas être modifié par celui qui l’emprunte
Je prête une valeur à une seule variable, tout en la laissant modifiable
Je ferais un autre article sur la notion de lifetime :)