Exploration du concept d'aliasing en Rust

RustRustBeginner
Pratiquer maintenant

This tutorial is from open-source community. Access the source code

💡 Ce tutoriel est traduit par l'IA à partir de la version anglaise. Pour voir la version originale, vous pouvez cliquer ici

Introduction

Dans ce laboratoire, le concept d'aliasing est exploré dans le contexte du langage de programmation Rust. L'aliasing réfère à la situation où plusieurs références sont créées pour les mêmes données, soit en tant que prêts immuables soit mutables.

Note : Si le laboratoire ne spécifie pas de nom de fichier, vous pouvez utiliser n'importe quel nom de fichier que vous voulez. Par exemple, vous pouvez utiliser main.rs, le compiler et l'exécuter avec rustc main.rs &&./main.


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL rust(("Rust")) -.-> rust/MemorySafetyandManagementGroup(["Memory Safety and Management"]) rust(("Rust")) -.-> rust/BasicConceptsGroup(["Basic Concepts"]) rust(("Rust")) -.-> rust/DataTypesGroup(["Data Types"]) rust(("Rust")) -.-> rust/FunctionsandClosuresGroup(["Functions and Closures"]) rust/BasicConceptsGroup -.-> rust/variable_declarations("Variable Declarations") rust/BasicConceptsGroup -.-> rust/mutable_variables("Mutable Variables") rust/DataTypesGroup -.-> rust/integer_types("Integer Types") rust/DataTypesGroup -.-> rust/type_casting("Type Conversion and Casting") rust/FunctionsandClosuresGroup -.-> rust/function_syntax("Function Syntax") rust/FunctionsandClosuresGroup -.-> rust/expressions_statements("Expressions and Statements") rust/MemorySafetyandManagementGroup -.-> rust/lifetime_specifiers("Lifetime Specifiers") subgraph Lab Skills rust/variable_declarations -.-> lab-99200{{"Exploration du concept d'aliasing en Rust"}} rust/mutable_variables -.-> lab-99200{{"Exploration du concept d'aliasing en Rust"}} rust/integer_types -.-> lab-99200{{"Exploration du concept d'aliasing en Rust"}} rust/type_casting -.-> lab-99200{{"Exploration du concept d'aliasing en Rust"}} rust/function_syntax -.-> lab-99200{{"Exploration du concept d'aliasing en Rust"}} rust/expressions_statements -.-> lab-99200{{"Exploration du concept d'aliasing en Rust"}} rust/lifetime_specifiers -.-> lab-99200{{"Exploration du concept d'aliasing en Rust"}} end

Aliasing

Les données peuvent être empruntées de manière immuable un nombre quelconque de fois, mais tant qu'elles sont empruntées de manière immuable, les données d'origine ne peuvent pas être empruntées de manière mutable. D'un autre côté, seul un prêt mutable est autorisé à la fois. Les données d'origine ne peuvent être empruntées à nouveau que après que la référence mutable ait été utilisée pour la dernière fois.

struct Point { x: i32, y: i32, z: i32 }

fn main() {
    let mut point = Point { x: 0, y: 0, z: 0 };

    let borrowed_point = &point;
    let another_borrow = &point;

    // Les données peuvent être accessibles via les références et le propriétaire original
    println!("Point a les coordonnées : ({}, {}, {})",
                borrowed_point.x, another_borrow.y, point.z);

    // Erreur! Impossible d'emprunter `point` en tant que mutable car il est actuellement
    // emprunté en tant qu'immutable.
    // let mutable_borrow = &mut point;
    // TODO ^ Essayez de décommenter cette ligne

    // Les valeurs empruntées sont utilisées à nouveau ici
    println!("Point a les coordonnées : ({}, {}, {})",
                borrowed_point.x, another_borrow.y, point.z);

    // Les références immuables ne sont plus utilisées pour le reste du code donc
    // il est possible de réemprunter avec une référence mutable.
    let mutable_borrow = &mut point;

    // Modifier les données via la référence mutable
    mutable_borrow.x = 5;
    mutable_borrow.y = 2;
    mutable_borrow.z = 1;

    // Erreur! Impossible d'emprunter `point` en tant qu'immutable car il est actuellement
    // emprunté en tant que mutable.
    // let y = &point.y;
    // TODO ^ Essayez de décommenter cette ligne

    // Erreur! Impossible d'afficher car `println!` prend une référence immutable.
    // println!("Point Z coordinate is {}", point.z);
    // TODO ^ Essayez de décommenter cette ligne

    // Ok! Les références mutables peuvent être passées en tant qu'immutables à `println!`
    println!("Point a les coordonnées : ({}, {}, {})",
                mutable_borrow.x, mutable_borrow.y, mutable_borrow.z);

    // La référence mutable n'est plus utilisée pour le reste du code donc il
    // est possible de réemprunter
    let new_borrowed_point = &point;
    println!("Point a maintenant les coordonnées : ({}, {}, {})",
             new_borrowed_point.x, new_borrowed_point.y, new_borrowed_point.z);
}

Résumé

Félicitations! Vous avez terminé le laboratoire sur l'aliasing. Vous pouvez pratiquer d'autres laboratoires sur LabEx pour améliorer vos compétences.