Desambiguación de Rasgos Superpuestos

Beginner

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

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.

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.