Les variables de types primitifs en Rust
Déclarer une variable
Rust est un langage à typage statique, ce qui veut dire qu’une fois déclarée, une variable ne peut pas changer de type.
En Rust on peut déclarer une variable sans lui donner de valeur, mais dans ce cas on est obligé de préciser son type.
La syntaxe est let ma_variable : mon_type;
, un petit exemple :
Lorsqu’on déclare une variable et qu’on lui donne une valeur, on n’est pas toujours obligé d’indiquer son type, car le compilateur peut le deviner en fonction de la valeur de la variable.
Dans certains cas on préfère indiquer le type d’une valeur manuellement.
Les variables sont immutables par défaut
La première chose à savoir avec les variables en Rust, c’est qu’elles sont immutables par défaut, c’est-à-dire qu’une fois créé, leur valeur ne peut pas être modifiée.
C’est un comportement qui peut paraitre bizarre, mais cela permet d’empêcher des effets de bords, c’est-à-dire des variables qui peuvent être modifié accidentellement en passant dans une fonction par exemple.
Là encore on voit bien l’importance que donne Rust à la rigueur.
Si on souhaite pouvoir modifier nos variables on va devoir les créer avec let mut
(pour mutable)
Variable Shadowing
Comme on vient de le voir les variables sont immutables par défaut, en revanche on est autorisé à faire du variable shadowing, c’est-à-dire déclarer plusieurs fois une variable avec le même nom pour changer sa valeur.
À noter que même si c’est possible, c’est en général une mauvaise idée d’utiliser ce concept, si une variable doit être mutable il vaut mieux la créer directement mutable afin de rendre le code clair.
Les constantes
Bon là tu dois de te dire “Ouais en gros les variables sont des constantes par défaut vu qu’on ne peut pas les modifier ?”
Eh bien pas tout à fait puisqu’en Rust on a aussi les constantes, qui vont avoir quelques différences avec les variables.
- Les constantes doivent avoir un nom en TOUT_EN_MAJUSCULE
- Elles peuvent être dans le global scope
- Leur type doit impérativement être défini explicitement même quand on indique la valeur
- Une constante peut stocker uniquement une valeur dont la taille est connue à la compilation
Les Data types
Comme dans tous les langages on retrouve différents types de données que peut prendre une variable.
Le type bool (Booléen)
Le type booléen peut prendre soit la valeur true
soit la valeur false
, il est stocké sur 1bit en mémoire.
Le type charactère
- Le type char (pour caractère) sert à contenir un seul caractère (lettre de l’alphabet, émoji, etc).
- Il est compris entre guillemets simples obligatoirement, c’est ce qui permet de les différencier des strings
Une variable de type char est stockée sur 32bits et représente la valeur unicode du caractère, on peut donc stocker bien plus que de l’ASCII comme des accents, de l’alphabet chinois, des émojis, etc.
Les types composés
Les types composés peuvent grouper plusieurs valeurs dans 1 type. Rust possède 2 types primitifs composés : Les tuples et les arrays.
Le type tuple
- Un tuple permet de stocker des valeurs qui peuvent être de type différents
- Pour définir un tuple on utilise les parenthèses
- Les tuples ont une taille fixée, une fois déclaré ils ne peuvent pas s’agrandir ou rétrécir
- Les valeurs contenues dans un tuple peuvent changer si le tuple est mutable
Dans l’exemple précédent on définit le type de tout ce qui se trouve dans le tuple, cette notation veut dire que le 1er élément est un i32, le 2ᵉ un f64 et le 3ᵉ un u8.
Les tuples permettent de définir plusieurs variables sur une ligne grâce à la déstructuration des tuples, Rust va
automatiquement assigner chaque variable du type de gauche avec la valeur correspondante du tuple de droite :
On accède aux éléments d’un tuple en utilisant le .
, par exemple si on veut le premier élément du tuple on
fera mon_tuple.0
:
Enfin un tuple sans aucune valeur est appelé tuple unitaire. Sa valeur et son type correspondant s’écrivent ()
et
représentent une valeur vide ou un type de retour vide. Les expressions retournent implicitement ()
si elles ne
retournent pas d’autres valeurs.
Le type array
Le type array a aussi une taille fixe, mais il ne peut stocker des valeurs que de même type !
Là encore on n’est pas obligé de préciser le type, mais si on le fait on doit impérativement préciser le nombre d’éléments contenu dans l’array.
Voici comment on définit explicitement le type d’un array
Pour initialiser un array plus rapidement on peut utiliser la syntaxe suivante
Ici la notation est au niveau de la valeur et pas du type, le 1er élément est la valeur que l’on veut répéter et la 2ᵉ est le nombre de fois que l’on veut la répéter.
Pour accéder aux éléments d’un array on va utiliser la syntaxe avec les crochets :
Si on essaye d’accéder à un index qui n’existe pas, rust va panic
, c’est-à-dire crasher en générant une erreur.