Structs y traits
22 pasos en 5 series de Mojo.
Un struct es la forma de nombrar un tipo en Mojo. No tiene encabezado oculto, ni vtable, ni una reserva de memoria que no pediste — los campos que declaras son la memoria que ocupa el valor, y el compilador los acomoda planos. Eso es lo que quiere decir la gente cuando llama a los structs de Mojo tipos de costo cero.
El corazón de todo es la semántica de valores. Asignar un struct lo copia en vez de crear un alias, y cada argumento declara su intención: de solo lectura por defecto, mut cuando la función edita el valor de quien la llama, var más un circunflejo al final cuando la propiedad se mueve. Los traits agregan encima comportamiento compartido sin renunciar a nada de eso — una función genérica acotada por un trait se compila de nuevo para cada tipo que encuentra, así que la abstracción desaparece antes de que el programa corra.
Este tour arma uno desde los campos pelados, sigue un valor por copias y transferencias, le enseña a un struct los operadores que merece, y cierra con los traits y el código genérico que habilitan.
Un primer struct
- Un struct y sus camposUn struct es un paquete de campos con nombre y una disposición fija que el compilador conoce exacta.
- Métodos en un structLos métodos son funciones que toman
self, así que leen los campos junto a él. - Inicialización campo por campo
@fieldwise_initescribe el constructor por ti: un argumento por campo, en orden. - Structs dentro de structsUn campo puede ser otro struct, y el conjunto sigue siendo un solo valor plano.
- Métodos estáticos como constructores
@staticmethodle da al struct constructores con nombre, que se leen mejor.
Semántica de valores
- Asignar copia el valorLos structs de Mojo son valores: asignar uno hace una copia independiente, no un alias.
- Transferir la propiedad
Ticketno es copiable, así que pasarlo adelante significa entregar la propiedad con^. - Mutar con mut
mutmarca un argumento que la función puede cambiar en el lugar, sobre el valor de quien llama. - De solo lectura por defectoLos argumentos son de solo lectura salvo que digas otra cosa, y eso no cuesta nada al correr.
- Hooks de copia y destrucciónUn struct puede definir qué significan para él copiarse y destruirse.
Operadores
- Sumar con __add__Implementa
__add__y el operador+empieza a funcionar sobre tu propio tipo. - Igualdad y orden
__eq__y__lt__le enseñan a un struct a responder==y<. - Indexar un struct
__getitem__y__setitem__ponen la sintaxis de corchetes en tu propio contenedor. - Qué cuenta como verdadero con __bool__
__bool__decide qué significa tu struct dentro de unif. - Structs que se imprimen solosConforma con
Writabley tu struct se imprime solo, sin ayudante de formato.
Traits
- Declarar un traitUn trait nombra los métodos que un tipo debe dar, sin decir cómo.
- Dos structs, un traitTipos sin parentesco pueden satisfacer el mismo trait, cada uno a su manera.
- Funciones genéricas sobre traitsUn trait bound deja que una función sirva a todo tipo conforme, compilada de nuevo para cada uno.
- Combinar trait bounds
&une trait bounds y exige que un tipo los satisfaga todos. - Ordenar tu propio structConforma con
Comparabley elsortestándar ordenará tus valores.
Bis
- Libro de cuentasUn struct de cuenta que cuida su propio saldo y lleva un historial corrido.
- Galería de figurasUn trait, tres figuras y una sola función genérica que las tabula todas.