Desambiguar rasgos superpuestos

Un tipo puede implementar muchos rasgos diferentes. ¿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 devolución!

Buenas noticias: dado que cada implementación de un rasgo tiene su propio bloque impl, está claro qué método get del rasgo está implementando.

¿Qué pasa cuando llega el momento de llamar esos métodos? Para eliminar la ambigüedad entre ellos, tenemos que usar la sintaxis totalmente calificada.

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

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

// Un formularioulario con WidgetNombreUsuario y WidgetEdad
struct Formulario {
    nombre_usuario: String,
    edad: u8,
}

impl WidgetNombreUsuario for Formulario {
    fn get(&self) -> String {
        self.nombre_usuario.clone()
    }
}

impl WidgetEdad for Formulario {
    fn get(&self) -> u8 {
        self.edad
    }
}

fn main() {
    let formulario = Formulario{
        nombre_usuario: "rustáceo".to_owned(),
        edad: 28,
    };

    // Si quitas el comentario de esta línea, obtendrás un error que dice "múltiples
    // `get` encontrados". Porque, después de todo, hay varios métodos llamados `get`.
    // println!("{}", formulario.get());

    let nombre_usuario = <Formulario as WidgetNombreUsuario>::get(&formulario);
    assert_eq!("rustáceo".to_owned(), nombre_usuario);
    let edad = <Formulario as WidgetEdad>::get(&formulario);
    assert_eq!(28, edad);
}

Ve también

El capítulo del Lenguaje de Programación Rust sobre sintaxis totalmente calificada