Passer au contenu principal
eLearner.app
Module 4 · Leçon 1 sur 27/14 dans le cours~12 min
Leçons du module (1/2)

Définir et instancier des Structs

Les struct (ou structures) en Rust sont des types de données personnalisés qui vous permettent de regrouper plusieurs valeurs associées. Elles sont similaires aux objets ou classes dans d'autres langages, mais sans héritage.

Définir une Struct

Pour définir une struct, on utilise le mot-clé struct suivi du nom en PascalCase. À l'intérieur, nous définissons les noms et les types des champs :

Code
struct User {
    username: String,
    email: String,
    active: bool,
    sign_in_count: u64,
}

Créer une Instance

Pour utiliser une struct, nous devons créer une instance en renseignant tous les champs spécifiés :

Code
fn main() {
    let user1 = User {
        email: String::from("alice@example.com"),
        username: String::from("alice123"),
        active: true,
        sign_in_count: 1,
    };

    // Accesso ai campi tramite notazione con punto
    println!("L'utente {} è attivo? {}", user1.username, user1.active);
}

Mutabilité des Structs

En Rust, l'ensemble de l'instance doit être marquée comme mutable (mut) si vous souhaitez modifier l'un de ses champs. Rust ne permet pas de marquer seulement certains champs comme mutables :

Code
fn main() {
    let mut user1 = User {
        email: String::from("alice@example.com"),
        username: String::from("alice123"),
        active: true,
        sign_in_count: 1,
    };

    user1.active = false; // Valido perché user1 è mutabile!
}

Tuple Structs et Unit-Like Structs

Rust prend en charge deux autres formats de struct en plus des structs classiques à champs nommés :

  1. Tuple Structs : Elles ont un nom associé mais les champs n'ont pas de noms individuels, ils possèdent uniquement le type. Elles sont utiles pour définir et différencier des types spécifiques :
    Code
    struct Point(i32, i32, i32);
    let origin = Point(0, 0, 0);
    
  2. Unit-Like Structs : Elles ne définissent aucun champ. Elles se comportent comme le type (). Elles s'avèrent utiles lorsqu'il faut implémenter des comportements (traits) sur un type sans y stocker de données.

À toi de jouer

Exercice#rust.m4.l1.e1
Tentatives : 0Chargement…

Définissez la struct User au-dessus du main avec les champs : username (de type String) et active (de type bool).

Chargement de l'éditeur…
Afficher l'indice

Écrivez `struct User { username: String, active: bool }`avant le`main`.

Solution disponible après 3 tentatives

Exercice#rust.m4.l1.e2
Tentatives : 0Chargement…

Modifiez user1 en la rendant mutable (let mut user1) et changez le champ active à false avant l'affichage.

Chargement de l'éditeur…
Afficher l'indice

Ajoutez `mut`à`let user1`pour qu'elle devienne`let mut user1`, puis insérez `user1.active = false;`.

Solution disponible après 3 tentatives

Exercice#rust.m4.l1.e3
Tentatives : 0Chargement…

Définissez une tuple struct nommée Color contenant trois champs entiers i32. Dans le main, instanciez Color avec les valeurs 255, 0 et 100 en l'assignant à la variable my_color, puis affichez son premier élément (valeur rouge) à l'aide de println!.

Chargement de l'éditeur…
Afficher l'indice

Définissez la tuple struct avec `struct Color(i32, i32, i32);`. Dans le main, instanciez-la avec `let my_color = Color(255, 0, 100);`et affichez la valeur rouge avec`my_color.0`.

Solution disponible après 3 tentatives