¿Qué es un Trait?
Parte de la sección Programación Orientada a Objetos 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 los traits.
Un trait define un conjunto de métodos que un tipo debe implementar. Piensa en ello como un contrato: cualquier tipo que "firme" este contrato se compromete a proporcionar el comportamiento especificado. Si has usado interfaces en otros lenguajes, los traits cumplen un propósito similar.
Así es como defines un trait:
trait Describable {
fn describe(&self) -> String;
}
La palabra clave trait introduce el trait, seguida 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 rasgos se vuelven potentes cuando varios tipos diferentes implementan el mismo rasgo. Un Book, un Car y una Person podrían ser Describable, y cada uno proporcionaría su propia descripción única. El rasgo garantiza que todos compartan esta capacidad común.
Desafío
Fácil¡Definamos 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 distintos 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 que, en una definición de trait, solo declaras la firma del método con un punto y coma: sin cuerpo. Esto le indica a Rust: «cualquier tipo que implemente este trait debe proporcionar un métodosummarizeque devuelva unString».main.rs: Incluye tu módulo de resumen e imprime un mensaje que confirme que tu trait está definido. Como todavía no hemos aprendido a implementar traits (¡esa es la próxima lección!), simplemente verificarás que tu trait se compile 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 únicamente 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 a hacer que las estructuras implementen este trait!
Pruébalo tú mismo
mod summary;
fn main() {
// TODO: Imprime el mensaje de confirmación de que el trait está definido
// Expected output: "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 Programación Orientada a Objetos
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 multimediaPractica por tu cuenta: Compilador de Rust online