New Type Idiom

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, nous explorons l'idiome newtype, qui offre des garanties au moment de la compilation en nous permettant de créer un nouveau type distinct de son type sous-jacent. Un exemple est présenté où une structure Years est utilisée pour représenter l'âge en années, et une structure Days est utilisée pour représenter l'âge en jours. En utilisant l'idiome newtype, nous pouvons nous assurer que le bon type de valeur est fourni à un programme, comme dans la fonction de vérification d'âge old_enough, qui nécessite une valeur de type Years. De plus, nous apprenons à obtenir la valeur d'un newtype comme son type sous-jacent en utilisant la syntaxe de tuple ou de décomposition.

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/DataTypesGroup(["Data Types"]) rust(("Rust")) -.-> rust/FunctionsandClosuresGroup(["Functions and Closures"]) rust(("Rust")) -.-> rust/DataStructuresandEnumsGroup(["Data Structures and Enums"]) rust(("Rust")) -.-> rust/AdvancedTopicsGroup(["Advanced Topics"]) rust(("Rust")) -.-> rust/BasicConceptsGroup(["Basic Concepts"]) rust/BasicConceptsGroup -.-> rust/variable_declarations("Variable Declarations") rust/DataTypesGroup -.-> rust/integer_types("Integer Types") rust/FunctionsandClosuresGroup -.-> rust/function_syntax("Function Syntax") rust/FunctionsandClosuresGroup -.-> rust/expressions_statements("Expressions and Statements") rust/DataStructuresandEnumsGroup -.-> rust/method_syntax("Method Syntax") rust/AdvancedTopicsGroup -.-> rust/traits("Traits") subgraph Lab Skills rust/variable_declarations -.-> lab-99352{{"New Type Idiom"}} rust/integer_types -.-> lab-99352{{"New Type Idiom"}} rust/function_syntax -.-> lab-99352{{"New Type Idiom"}} rust/expressions_statements -.-> lab-99352{{"New Type Idiom"}} rust/method_syntax -.-> lab-99352{{"New Type Idiom"}} rust/traits -.-> lab-99352{{"New Type Idiom"}} end

New Type Idiom

L'idiome newtype offre des garanties au moment de la compilation pour s'assurer que le bon type de valeur est fourni à un programme.

Par exemple, une fonction de vérification d'âge qui vérifie l'âge en années doit recevoir une valeur de type Years.

struct Years(i64);

struct Days(i64);

impl Years {
    pub fn to_days(&self) -> Days {
        Days(self.0 * 365)
    }
}


impl Days {
    /// tronque les années fractionnaires
    pub fn to_years(&self) -> Years {
        Years(self.0 / 365)
    }
}

fn old_enough(age: &Years) -> bool {
    age.0 >= 18
}

fn main() {
    let age = Years(5);
    let age_days = age.to_days();
    println!("Old enough {}", old_enough(&age));
    println!("Old enough {}", old_enough(&age_days.to_years()));
    // println!("Old enough {}", old_enough(&age_days));
}

Décommentez la dernière instruction println! pour constater que le type fourni doit être Years.

Pour obtenir la valeur du newtype sous forme de type de base, vous pouvez utiliser la syntaxe de tuple ou de décomposition comme ceci :

struct Years(i64);

fn main() {
    let years = Years(42);
    let years_as_primitive_1: i64 = years.0; // Tuple
    let Years(years_as_primitive_2) = years; // Destructuring
}

Summary

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