Newtype-Idiom

RustRustBeginner
Jetzt üben

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

💡 Dieser Artikel wurde von AI-Assistenten übersetzt. Um die englische Version anzuzeigen, können Sie hier klicken

Einführung

In diesem Lab untersuchen wir das newtype-Idiom, das Kompilierzeitgarantien bietet, indem es uns ermöglicht, einen neuen Typ zu erstellen, der von seinem zugrunde liegenden Typ unterschieden ist. Ein Beispiel wird gezeigt, bei dem eine Struktur Years verwendet wird, um das Alter in Jahren darzustellen, und eine Struktur Days verwendet wird, um das Alter in Tagen darzustellen. Mit dem newtype-Idiom können wir sicherstellen, dass der richtige Werttyp an ein Programm übergeben wird, wie beispielsweise in der Altersüberprüfungsfunktion old_enough, die einen Wert vom Typ Years erfordert. Darüber hinaus lernen wir, wie wir den Wert eines newtype als seinen zugrunde liegenden Typ mithilfe von Tuple- oder Destrukturierungsyntax erhalten.

Hinweis: Wenn das Lab keinen Dateinamen angibt, können Sie einen beliebigen Dateinamen verwenden. Beispielsweise können Sie main.rs verwenden und es mit rustc main.rs &&./main kompilieren und ausführen.

Newtype-Idiom

Das Newtype-Idiom bietet Kompilierzeitgarantien dafür, dass der richtige Werttyp an ein Programm übergeben wird.

Beispielsweise muss einer Altersüberprüfungsfunktion, die das Alter in Jahren überprüft, ein Wert vom Typ Years übergeben werden.

struct Years(i64);

struct Days(i64);

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


impl Days {
    /// kürzt unvollständige Jahre ab
    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!("Alt genug {}", old_enough(&age));
    println!("Alt genug {}", old_enough(&age_days.to_years()));
    // println!("Alt genug {}", old_enough(&age_days));
}

Entkommentieren Sie die letzte Print-Anweisung, um zu beobachten, dass der übergebene Typ Years sein muss.

Um den Wert des Newtypes als Basistyp zu erhalten, können Sie die Tuple- oder Destrukturierungsyntax wie folgt verwenden:

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
}

Zusammenfassung

Herzlichen Glückwunsch! Sie haben das New Type Idiom Lab abgeschlossen. Sie können in LabEx weitere Labs ausprobieren, um Ihre Fähigkeiten zu verbessern.