Menu
Coddy logo textTech

From et Into

Fait partie de la section Programmation Orientée Objet du Journey Rust de Coddy. Leçon 57 sur 61.

La conversion entre les types est une tâche courante en Rust. Le trait From fournit une manière standardisée de définir comment un type peut être créé à partir d’un autre. Lorsque vous implémentez From, vous obtenez automatiquement le trait Into gratuitement.

Pour implémenter From, vous définissez comment construire votre type à partir d’un autre type :

struct Meters(f64);
struct Kilometers(f64);

impl From<Kilometers> for Meters {
    fn from(km: Kilometers) -> Self {
        Meters(km.0 * 1000.0)
    }
}

Vous pouvez maintenant effectuer la conversion en utilisant soit la fonction from, soit la méthode into :

let distance = Kilometers(5.0);

// Utilisation explicite de From
let m1 = Meters::from(distance);

// Utilisation d'Into (fonctionne car From est implémenté)
let distance = Kilometers(3.0);
let m2: Meters = distance.into();

La méthode into() nécessite une annotation de type, car Rust doit savoir vers quel type vous effectuez la conversion. Ce modèle est particulièrement utile lorsque vous avez des structures auxiliaires qui doivent être converties en vos types principaux, comme la conversion de données de configuration en un objet initialisé ou la transformation d’une entrée brute en une structure validée.

challenge icon

Défi

Facile

Construisons un système de conversion de températures à l'aide du trait From ! Vous créerez deux types de température, Celsius et Fahrenheit, et implémenterez les conversions entre eux à l'aide des traits de conversion standard de Rust.

Vous organiserez votre code sur deux fichiers :

  • temperature.rs : définissez deux structs newtype publics, Celsius et Fahrenheit, encapsulant toutes deux un f64. Implémentez le trait From pour convertir Celsius en Fahrenheit à l'aide de la formule : fahrenheit = celsius × 1.8 + 32.0. Ajoutez également une méthode value à chaque struct, qui renvoie le f64 interne.
  • main.rs : incluez votre module de température et présentez les deux approches de conversion. Créez une valeur Celsius à partir de la valeur fournie, puis convertissez-la en Fahrenheit à l'aide de Fahrenheit::from(). Créez une autre valeur Celsius et convertissez-la à l'aide de la méthode .into(). Affichez les deux résultats.

La formule de conversion de Celsius en Fahrenheit est la suivante : multipliez par 1.8 et ajoutez 32. N'oubliez pas que l'implémentation de From<Celsius> for Fahrenheit vous fournit automatiquement et gratuitement le trait Into<Fahrenheit> sur Celsius !

Les deux températures sont affichées sous forme de nombres entiers : convertissez chaque f64 avec as i64, ce qui supprime les décimales vers zéro. Ainsi, une entrée de 36.6 est affichée comme 36C, et les 97.88 degrés Fahrenheit auxquels elle est convertie sont affichés comme 97F. Aucun arrondi supérieur n'est effectué.

Votre sortie doit afficher les deux conversions dans ce format :

From: {celsius1}C = {fahrenheit1}F
Into: {celsius2}C = {fahrenheit2}F

Par exemple, avec les entrées 0 et 100 :

From: 0C = 32F
Into: 100C = 212F

Et avec les entrées 25 et -40 :

From: 25C = 77F
Into: -40C = -40F

Vous recevrez deux entrées : la première valeur Celsius (à analyser comme un f64) et la deuxième valeur Celsius (à analyser comme un f64).

Essayez vous-même

mod temperature;

use temperature::{Celsius, Fahrenheit};

fn main() {
    // Lire l'entrée
    let mut input1 = String::new();
    std::io::stdin().read_line(&mut input1).expect("Failed to read line");
    let celsius1: f64 = input1.trim().parse().expect("Invalid number");
    
    let mut input2 = String::new();
    std::io::stdin().read_line(&mut input2).expect("Failed to read line");
    let celsius2: f64 = input2.trim().parse().expect("Invalid number");
    
    // TODO: Créer une valeur Celsius à partir de celsius1
    // TODO: La convertir en Fahrenheit en utilisant Fahrenheit::from()
    
    // TODO: Créer une autre valeur Celsius à partir de celsius2
    // TODO: La convertir en Fahrenheit en utilisant .into()
    
    // TODO: Afficher les résultats au format :
    // From: {celsius1}C = {fahrenheit1}F
    // Into: {celsius2}C = {fahrenheit2}F
}
quiz iconTestez-vous

Cette leçon comprend un petit quiz. Commencez la leçon pour y répondre et suivre votre progression.

Toutes les leçons de Programmation Orientée Objet

Entraînez-vous par vous-même : Compilateur Rust en ligne