Traits y genéricos
19 pasos en 6 series de Rust.
Los traits son la forma en que Rust hace polimorfismo, y los genéricos son la forma en que se mantiene rápido mientras lo hace. El tour cubre definir e implementar traits, funciones genéricas y bounds, y los traits estándar que vale la pena saberse de memoria: Display, From, Iterator, Default.
Siguen la sobrecarga de operadores y la indexación, luego el despacho dinámico y lo que se sacrifica frente a la monomorfización. Diecinueve pasos, y este es el tour que decide si puedes leer el Rust de otras personas.
Traits
- TraitsComportamiento compartido que un tipo puede implementar.
- Métodos por defectoUn trait puede aportar comportamiento; los implementadores solo escriben lo que difiere.
- Tipos asociadosCuando un trait tiene un tipo por implementador, un tipo asociado gana al parámetro.
Genéricos
- Funciones genéricas y boundsUn parámetro de tipo con bounds: una función, todos los tipos que satisfacen el trait.
- Máximo genéricoUna función genérica con un trait bound: todo el enfoque de Rust al polimorfismo, en miniatura.
- Structs genéricosUn struct sobre un parámetro de tipo, con bloques impl genéricos o específicos.
- impl TraitTipos anónimos en las firmas: cualquier argumento que encaje, cualquier retorno que cumpla.
Traits estándar
- From e IntoImplementa From y obtienes Into gratis, en ambas direcciones de la llamada.
- Display y DebugDebug es para programadores, Display para personas — deriva uno, escribe el otro.
- DefaultUn valor vacío canónico, más la sintaxis de actualización de struct para cambiar un campo.
- Orden personalizadoImplementar Ord decide cómo se ordena tu tipo en todos los lugares donde se compara.
Operadores y acceso
- Sobrecarga de operadoresLos operadores son traits: implementa Add y + funciona en tu tipo.
- Implementar IndexIndex le da a tu tipo la sintaxis de corchetes, prestando lo que devuelve.
- Deref en un newtypeDeref deja que una envoltura reenvíe los métodos del tipo interno sin escribir ninguno.
- Drop y RAIIDrop corre cuando un valor sale del alcance; así hace Rust la limpieza.
Despacho dinámico
- Trait objectsUn Vec de Box<dyn Trait> guarda tipos concretos distintos tras una sola interfaz.
- Implementaciones blanketImplementar un trait para todo tipo que cumpla un bound — un trait de extensión.
- Implementar IteratorUn método next y todos los adaptadores de la biblioteca estándar funcionan en tu tipo.
Bis
- shapes.rsTrait objects y genéricos juntos: un registro de figuras que mide y ordena.