Phantom-Typ-Parameter

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 Konzept von Phantom-Typ-Parametern, die Typ-Parameter sind, die statisch zur Compile-Zeit überprüft werden und keine Laufzeit-Behavior oder -Werte haben. Wir demonstrieren ihre Verwendung in Rust, indem wir std::marker::PhantomData mit dem Konzept von Phantom-Typ-Parametern kombinieren, um Tupel und Structs zu erstellen, die verschiedene Datentypen enthalten.

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.


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL rust(("Rust")) -.-> rust/MemorySafetyandManagementGroup(["Memory Safety and Management"]) rust(("Rust")) -.-> rust/AdvancedTopicsGroup(["Advanced Topics"]) rust(("Rust")) -.-> rust/BasicConceptsGroup(["Basic Concepts"]) rust(("Rust")) -.-> rust/DataTypesGroup(["Data Types"]) rust(("Rust")) -.-> rust/FunctionsandClosuresGroup(["Functions and Closures"]) rust/BasicConceptsGroup -.-> rust/variable_declarations("Variable Declarations") rust/DataTypesGroup -.-> rust/floating_types("Floating-point Types") rust/DataTypesGroup -.-> rust/type_casting("Type Conversion and Casting") rust/FunctionsandClosuresGroup -.-> rust/function_syntax("Function Syntax") rust/FunctionsandClosuresGroup -.-> rust/expressions_statements("Expressions and Statements") rust/MemorySafetyandManagementGroup -.-> rust/lifetime_specifiers("Lifetime Specifiers") rust/AdvancedTopicsGroup -.-> rust/operator_overloading("Traits for Operator Overloading") subgraph Lab Skills rust/variable_declarations -.-> lab-99355{{"Phantom-Typ-Parameter"}} rust/floating_types -.-> lab-99355{{"Phantom-Typ-Parameter"}} rust/type_casting -.-> lab-99355{{"Phantom-Typ-Parameter"}} rust/function_syntax -.-> lab-99355{{"Phantom-Typ-Parameter"}} rust/expressions_statements -.-> lab-99355{{"Phantom-Typ-Parameter"}} rust/lifetime_specifiers -.-> lab-99355{{"Phantom-Typ-Parameter"}} rust/operator_overloading -.-> lab-99355{{"Phantom-Typ-Parameter"}} end

Phantom-Typ-Parameter

Ein Phantom-Typ-Parameter ist ein Parameter, der zur Laufzeit nicht auftritt, sondern statisch (und nur) zur Compile-Zeit überprüft wird.

Datentypen können zusätzliche generische Typ-Parameter verwenden, um als Marker zu fungieren oder zur Typüberprüfung zur Compile-Zeit zu dienen. Diese zusätzlichen Parameter speichern keine Werte und haben keine Laufzeit-Behavior.

Im folgenden Beispiel kombinieren wir [std::marker::PhantomData] mit dem Phantom-Typ-Parameter-Konzept, um Tupel zu erstellen, die verschiedene Datentypen enthalten.

use std::marker::PhantomData;

// Ein Phantom-Tupel-Struct, das über `A` generisch ist mit verstecktem Parameter `B`.
#[derive(PartialEq)] // Erlaube Gleichheitstest für diesen Typ.
struct PhantomTuple<A, B>(A, PhantomData<B>);

// Ein Phantom-Typ-Struct, der über `A` generisch ist mit verstecktem Parameter `B`.
#[derive(PartialEq)] // Erlaube Gleichheitstest für diesen Typ.
struct PhantomStruct<A, B> { first: A, phantom: PhantomData<B> }

// Hinweis: Speicher wird für den generischen Typ `A` zugewiesen, aber nicht für `B`.
// Daher kann `B` nicht in Berechnungen verwendet werden.

fn main() {
    // Hier sind `f32` und `f64` die versteckten Parameter.
    // PhantomTuple-Typ angegeben als `<char, f32>`.
    let _tuple1: PhantomTuple<char, f32> = PhantomTuple('Q', PhantomData);
    // PhantomTuple-Typ angegeben als `<char, f64>`.
    let _tuple2: PhantomTuple<char, f64> = PhantomTuple('Q', PhantomData);

    // Typ angegeben als `<char, f32>`.
    let _struct1: PhantomStruct<char, f32> = PhantomStruct {
        first: 'Q',
        phantom: PhantomData,
    };
    // Typ angegeben als `<char, f64>`.
    let _struct2: PhantomStruct<char, f64> = PhantomStruct {
        first: 'Q',
        phantom: PhantomData,
    };

    // Compile-Zeitfehler! Typfehler, daher können diese nicht verglichen werden:
    // println!("_tuple1 == _tuple2 liefert: {}",
    //           _tuple1 == _tuple2);

    // Compile-Zeitfehler! Typfehler, daher können diese nicht verglichen werden:
    // println!("_struct1 == _struct2 liefert: {}",
    //           _struct1 == _struct2);
}

Zusammenfassung

Herzlichen Glückwunsch! Sie haben das Lab zu Phantom-Typ-Parametern abgeschlossen. Sie können in LabEx weitere Labs absolvieren, um Ihre Fähigkeiten zu verbessern.