Parámetros de Tipo Fantasma

RustRustBeginner
Practicar Ahora

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

💡 Este tutorial está traducido por IA desde la versión en inglés. Para ver la versión original, puedes hacer clic aquí

Introducción

En este laboratorio, exploramos el concepto de parámetros de tipo fantasma, que son parámetros de tipo que se comprueban en tiempo de compilación de manera estática y no tienen ningún comportamiento o valores en tiempo de ejecución. Demostramos su uso en Rust combinando std::marker::PhantomData con el concepto de parámetros de tipo fantasma para crear tuplas y structs que contengan diferentes tipos de datos.

Nota: Si el laboratorio no especifica un nombre de archivo, puedes usar cualquier nombre de archivo que desees. Por ejemplo, puedes usar main.rs, compilar y ejecutarlo con rustc main.rs &&./main.


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL rust(("Rust")) -.-> rust/BasicConceptsGroup(["Basic Concepts"]) rust(("Rust")) -.-> rust/DataTypesGroup(["Data Types"]) rust(("Rust")) -.-> rust/FunctionsandClosuresGroup(["Functions and Closures"]) rust(("Rust")) -.-> rust/MemorySafetyandManagementGroup(["Memory Safety and Management"]) rust(("Rust")) -.-> rust/AdvancedTopicsGroup(["Advanced Topics"]) 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{{"Parámetros de Tipo Fantasma"}} rust/floating_types -.-> lab-99355{{"Parámetros de Tipo Fantasma"}} rust/type_casting -.-> lab-99355{{"Parámetros de Tipo Fantasma"}} rust/function_syntax -.-> lab-99355{{"Parámetros de Tipo Fantasma"}} rust/expressions_statements -.-> lab-99355{{"Parámetros de Tipo Fantasma"}} rust/lifetime_specifiers -.-> lab-99355{{"Parámetros de Tipo Fantasma"}} rust/operator_overloading -.-> lab-99355{{"Parámetros de Tipo Fantasma"}} end

Parámetros de tipo fantasma

Un parámetro de tipo fantasma es aquel que no aparece en tiempo de ejecución, pero se comprueba en tiempo de compilación (y solo) de manera estática.

Los tipos de datos pueden usar parámetros de tipo genéricos adicionales para actuar como marcadores o para realizar comprobaciones de tipo en tiempo de compilación. Estos parámetros adicionales no tienen valores de almacenamiento y no tienen comportamiento en tiempo de ejecución.

En el siguiente ejemplo, combinamos [std::marker::PhantomData] con el concepto de parámetro de tipo fantasma para crear tuplas que contengan diferentes tipos de datos.

use std::marker::PhantomData;

// Una struct de tupla fantasma que es genérica sobre `A` con parámetro oculto `B`.
#[derive(PartialEq)] // Permite la prueba de igualdad para este tipo.
struct PhantomTuple<A, B>(A, PhantomData<B>);

// Una struct de tipo fantasma que es genérica sobre `A` con parámetro oculto `B`.
#[derive(PartialEq)] // Permite la prueba de igualdad para este tipo.
struct PhantomStruct<A, B> { first: A, phantom: PhantomData<B> }

// Nota: Se asigna almacenamiento para el tipo genérico `A`, pero no para `B`.
//       Por lo tanto, `B` no se puede usar en cálculos.

fn main() {
    // Aquí, `f32` y `f64` son los parámetros ocultos.
    // Tipo PhantomTuple especificado como `<char, f32>`.
    let _tuple1: PhantomTuple<char, f32> = PhantomTuple('Q', PhantomData);
    // Tipo PhantomTuple especificado como `<char, f64>`.
    let _tuple2: PhantomTuple<char, f64> = PhantomTuple('Q', PhantomData);

    // Tipo especificado como `<char, f32>`.
    let _struct1: PhantomStruct<char, f32> = PhantomStruct {
        first: 'Q',
        phantom: PhantomData,
    };
    // Tipo especificado como `<char, f64>`.
    let _struct2: PhantomStruct<char, f64> = PhantomStruct {
        first: 'Q',
        phantom: PhantomData,
    };

    // ¡Error de compilación! Hay un desajuste de tipos, por lo que no se pueden comparar:
    // println!("_tuple1 == _tuple2 produce: {}",
    //           _tuple1 == _tuple2);

    // ¡Error de compilación! Hay un desajuste de tipos, por lo que no se pueden comparar:
    // println!("_struct1 == _struct2 produce: {}",
    //           _struct1 == _struct2);
}

Resumen

¡Felicitaciones! Has completado el laboratorio de Parámetros de Tipo Fantasma. Puedes practicar más laboratorios en LabEx para mejorar tus habilidades.