Desambiguación de Rasgos Superpuestos

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, se discute el problema de desambiguar rasgos superpuestos, donde dos rasgos tienen métodos con el mismo nombre y tipos de retorno potencialmente diferentes.

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


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL rust(("Rust")) -.-> rust/AdvancedTopicsGroup(["Advanced Topics"]) rust(("Rust")) -.-> rust/BasicConceptsGroup(["Basic Concepts"]) rust(("Rust")) -.-> rust/DataTypesGroup(["Data Types"]) rust(("Rust")) -.-> rust/DataStructuresandEnumsGroup(["Data Structures and Enums"]) rust(("Rust")) -.-> rust/FunctionsandClosuresGroup(["Functions and Closures"]) rust(("Rust")) -.-> rust/MemorySafetyandManagementGroup(["Memory Safety and Management"]) rust/BasicConceptsGroup -.-> rust/variable_declarations("Variable Declarations") rust/DataTypesGroup -.-> rust/integer_types("Integer Types") rust/DataTypesGroup -.-> rust/string_type("String Type") 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/DataStructuresandEnumsGroup -.-> rust/method_syntax("Method Syntax") rust/AdvancedTopicsGroup -.-> rust/traits("Traits") subgraph Lab Skills rust/variable_declarations -.-> lab-99222{{"Desambiguación de Rasgos Superpuestos"}} rust/integer_types -.-> lab-99222{{"Desambiguación de Rasgos Superpuestos"}} rust/string_type -.-> lab-99222{{"Desambiguación de Rasgos Superpuestos"}} rust/type_casting -.-> lab-99222{{"Desambiguación de Rasgos Superpuestos"}} rust/function_syntax -.-> lab-99222{{"Desambiguación de Rasgos Superpuestos"}} rust/expressions_statements -.-> lab-99222{{"Desambiguación de Rasgos Superpuestos"}} rust/lifetime_specifiers -.-> lab-99222{{"Desambiguación de Rasgos Superpuestos"}} rust/method_syntax -.-> lab-99222{{"Desambiguación de Rasgos Superpuestos"}} rust/traits -.-> lab-99222{{"Desambiguación de Rasgos Superpuestos"}} end

Desambiguación de rasgos superpuestos

Un tipo puede implementar muchos diferentes rasgos. ¿Qué pasa si dos rasgos requieren el mismo nombre? Por ejemplo, muchos rasgos pueden tener un método llamado get(). ¡Incluso pueden tener diferentes tipos de retorno!

Buena noticia: debido a que cada implementación de rasgo tiene su propio bloque impl, queda claro qué método get de qué rasgo estás implementando.

¿Qué pasa cuando llega el momento de llamar a esos métodos? Para desambiguar entre ellos, tenemos que usar la Sintaxis Cualificada Completa.

trait UsernameWidget {
    // Obtener el nombre de usuario seleccionado de este widget
    fn get(&self) -> String;
}

trait AgeWidget {
    // Obtener la edad seleccionada de este widget
    fn get(&self) -> u8;
}

// Un formulario con tanto un UsernameWidget como un AgeWidget
struct Form {
    username: String,
    age: u8,
}

impl UsernameWidget for Form {
    fn get(&self) -> String {
        self.username.clone()
    }
}

impl AgeWidget for Form {
    fn get(&self) -> u8 {
        self.age
    }
}

fn main() {
    let form = Form {
        username: "rustacean".to_owned(),
        age: 28,
    };

    // Si descomentas esta línea, obtendrás un error que dice
    // "se encontraron múltiples `get`". Porque, después de todo, hay múltiples métodos
    // llamados `get`.
    // println!("{}", form.get());

    let username = <Form as UsernameWidget>::get(&form);
    assert_eq!("rustacean".to_owned(), username);
    let age = <Form as AgeWidget>::get(&form);
    assert_eq!(28, age);
}

Resumen

¡Felicidades! Has completado el laboratorio de Desambiguación de Rasgos Superpuestos. Puedes practicar más laboratorios en LabEx para mejorar tus habilidades.