¿Qué es un Trait?
Parte de la sección Object Oriented Programming del Journey de Rust de Coddy — lección 29 de 61.
Los genéricos te permiten escribir código que funciona con cualquier tipo, pero a veces necesitas garantizar que un tipo pueda hacer algo específico. Aquí es donde entran en juego los traits.
Un trait define un conjunto de métodos que un tipo debe implementar. Piénsalo como un contrato: cualquier tipo que "firme" este contrato promete proporcionar el comportamiento especificado. Si has utilizado interfaces en otros lenguajes, los traits cumplen un propósito similar.
Así es como se define un trait:
trait Describable {
fn describe(&self) -> String;
}
La palabra clave trait introduce el trait, seguido de su nombre. Dentro de las llaves, declaras las firmas de los métodos: solo el nombre, los parámetros y el tipo de retorno, sin cuerpo. El punto y coma después de la firma indica que esto es un requisito, no una implementación.
Este trait Describable dice: "Cualquier tipo que me implemente debe proporcionar un método describe que tome una referencia a sí mismo y devuelva un String". Al trait no le importa cómo funciona el método; eso depende de cada tipo que lo implemente.
Los traits se vuelven poderosos cuando múltiples tipos diferentes implementan el mismo trait. Un Book, un Car y una Person podrían ser todos Describable, cada uno proporcionando su propia descripción única. El trait garantiza que todos compartan esta capacidad común.
Desafío
Fácil¡Vamos a definir tu primer trait! Un trait establece un contrato: una promesa de que cualquier tipo que lo implemente proporcionará un comportamiento específico. Crearás un trait Summarizable que diferentes tipos pueden implementar para proporcionar un resumen de sí mismos.
Organizarás tu código en dos archivos:
summary.rs: Define un trait público llamadoSummarizablecon una única firma de método:summarize(&self) -> String. Recuerda, en la definición de un trait solo declaras la firma del método con un punto y coma, sin cuerpo. Esto le dice a Rust "cualquier tipo que implemente este trait debe proporcionar un métodosummarizeque devuelva unString".main.rs: Incorpora tu módulo summary e imprime un mensaje confirmando que tu trait está definido. Dado que aún no hemos aprendido cómo implementar traits (¡esa es la próxima lección!), simplemente verificarás que tu trait se compila correctamente.
En tu archivo principal, imprime el siguiente mensaje para confirmar que la definición de tu trait es válida:
Summarizable trait defined successfully!Este desafío se centra puramente en la sintaxis de definición de traits: la palabra clave trait, el nombre del trait y la declaración de firmas de métodos sin implementaciones. ¡En la próxima lección, aprenderás cómo hacer que los structs implementen este trait!
Hoja de referencia
Un trait define un conjunto de métodos que un tipo debe implementar. Actúa como un contrato que garantiza que un tipo proporciona un comportamiento específico.
Para definir un trait, usa la palabra clave trait seguida del nombre del trait y las firmas de los métodos:
trait Describable {
fn describe(&self) -> String;
}
Las firmas de los métodos en los traits incluyen el nombre, los parámetros y el tipo de retorno, pero no el cuerpo. El punto y coma indica que esto es un requisito para los tipos que lo implementan.
Múltiples tipos diferentes pueden implementar el mismo trait, cada uno proporcionando su propia implementación de los métodos requeridos.
Pruébalo tú mismo
mod summary;
fn main() {
// TODO: Imprime el mensaje de confirmación de que el trait está definido
// Salida esperada: "Summarizable trait defined successfully!"
}
Esta lección incluye un breve cuestionario. Empieza la lección para responderlo y registrar tu progreso.
Todas las lecciones de Object Oriented Programming
1Métodos y Comportamiento
Intro a Bloques de ImplementaciónEl Parámetro SelfMétodos MutablesFunciones AsociadasMúltiples Bloques de ImplementaciónEncadenamiento de MétodosResumen - Acciones de Rectángulo4Proyecto: Mascota virtual
Definir la mascotaAlimentar a la mascota7Traits estándar
El trait DebugEl trait DisplayClone y CopyTraits de igualdadResumen - Punto imprimible10Proyecto: Sistema de documentos
El Trait DrawComponente de texto2Encapsulamiento y módulos
Conceptos básicos de módulosLa palabra clave PublicCampos privadosGettersSettersRepaso - Casillero seguro5Genéricos
Estructuras genéricasMétodos genéricosMúltiples tipos genéricosFunciones genéricasResumen - Punto de coordenadas8Traits como límites
Sintaxis de límites de traitsLímites múltiplesLa cláusula whereRetornar tipos con traitsResumen: Impresora genérica11Patrones de diseño en Rust
Patrón NewtypeComposiciónEl Trait DropFrom e IntoResumen - Mock de Smart Pointer3Enums avanzados
Enums con datosMétodos en EnumsCoincidencia de variantes de datosEl Enum Option revisitadoResumen - Enum Shape6Definición de Traits
¿Qué es un Trait?Implementación de TraitsImplementaciones por defectoSobrescribir valores por defectoTraits con parámetrosResumen - Reproductor multimedia