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 avecrustc 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.