From et Into

Beginner

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

Introduction

Dans ce laboratoire, nous explorons les concepts des traits From et Into en Rust, qui sont utilisés pour convertir entre différents types. Ces traits sont intrinsèquement liés, avec Into étant le réciproque de From. Le trait From permet à un type de définir comment se créer à partir d'un autre type, permettant une conversion facile entre types. Le trait Into appelle automatiquement l'implémentation de From si nécessaire. Les deux traits peuvent être implémentés pour des types personnalisés, offrant une flexibilité dans les conversions de type.

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.

From et Into

Les traits From et Into sont intrinsèquement liés, et c'est en fait une partie de leur implémentation. Si vous êtes capable de convertir le type A à partir du type B, alors il devrait être facile de croire que nous devrions être capables de convertir le type B en type A.

From

Le trait From permet à un type de définir comment se créer lui-même à partir d'un autre type, offrant ainsi un mécanisme très simple pour convertir entre plusieurs types. Il existe de nombreuses implémentations de ce trait dans la bibliothèque standard pour la conversion de types primitifs et courants.

Par exemple, nous pouvons facilement convertir une str en une String

let my_str = "hello";
let my_string = String::from(my_str);

Nous pouvons faire de même pour définir une conversion pour notre propre type.

use std::convert::From;

#[derive(Debug)]
struct Number {
    value: i32,
}

impl From<i32> for Number {
    fn from(item: i32) -> Self {
        Number { value: item }
    }
}

fn main() {
    let num = Number::from(30);
    println!("My number is {:?}", num);
}

Into

Le trait Into est simplement le réciproque du trait From. C'est-à-dire que si vous avez implémenté le trait From pour votre type, Into l'appellera si nécessaire.

Utiliser le trait Into nécessitera généralement de spécifier le type de conversion car le compilateur est incapable de le déterminer la plupart du temps. Cependant, c'est un petit compromis compte tenu que nous obtenons cette fonctionnalité gratuitement.

use std::convert::Into;

#[derive(Debug)]
struct Number {
    value: i32,
}

impl Into<Number> for i32 {
    fn into(self) -> Number {
        Number { value: self }
    }
}

fn main() {
    let int = 5;
    // Essayez de supprimer l'annotation de type
    let num: Number = int.into();
    println!("My number is {:?}", num);
}

Résumé

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