pagina - ¿Por qué Rust tiene estructura y enumeración?
rust online (3)
En primer lugar, Rust tiene una amplia gama de tipos de datos:
- Estructuras con campos nombrados (
struct Foo {bar: uint}
) - Estructuras de tupla (
struct Foo(pub Bar, Baz)
) - Estructuras sin campos (
struct Foo;
) - Enums, con varios tipos de variantes:
- Variantes sin campos (ej.
None
) - Variantes de la tupla (por ejemplo,
Some(T)
) - Variantes de Struct (por ejemplo,
Some { pub inner :T }
)
- Variantes sin campos (ej.
Esto le da al programador cierta flexibilidad en la definición de tipos de datos. A menudo, no desea campos con nombre, especialmente si la estructura / variante tiene solo un campo. Rust le permite usar estructuras de tuplas / variantes de tuplas en ese caso.
Si las estructuras se eliminaran de Rust, no habría pérdida de funcionalidad, se podrían usar de nuevo enumeraciones con variantes de estructura. Pero habría un número abrumador de enumeraciones de una sola variante que serían innecesarias y engorrosas de usar.
Las enumeraciones de Rust son tipos de datos algebraicos. Por lo que puedo decir, esto parece subsumir qué estructura es. ¿Qué tiene de diferente la estructura que requiere mantenerla?
No es 100% correcto, pero es otra buena manera de pensar en ello: la enum
no es realmente superior a la struct
, la sintaxis del azúcar solo hace que se vea como es.
Una enum
es un tipo de suma, lo que significa que su valor es un valor de uno de un conjunto de otros tipos. El tipo de Result<T, E>
es de tipo T
o E
Por lo tanto, cada variante de enum
tiene exactamente un tipo asociado. Todo lo demás (sin tipo, variantes de tupla y variantes de estructura) podría ser sintaxis de azúcar.
enum Animal {
// without syntax sugar
Cat(i32),
// desugars to `Dog(())` (empty tuple/unit)
Dog,
// desugars to `Horse((i32, bool))` (tuple)
Horse(i32, bool),
// desugars to `Eagle(GeneratedEagleType)` and a struct definition outside
// of this enum `struct GeneratedEagleType { weight: i32, male: bool }`
Eagle { weight: i32, male: bool }
}
Por lo tanto, sería suficiente si cada variante de enum
estuviera asociada con exactamente un tipo. Y en ese caso, la enum
no es superior a struct
, porque no puede construir tipos de productos (como struct
).
Para poder escribir la "definición de tipo" dentro de la definición de variante de la enumeración es solo por conveniencia.
También: struct
es superior a "tuple structs" y "tuplas", también. Si ignoramos los nombres, esas tres cosas son nearly equivalentes. Pero Rust todavía tiene esos tres tipos diferentes de tipos para su conveniencia.
Tenga en cuenta que no sé si esas definiciones de enumeración son en realidad azúcar de sintaxis o no. Pero podrían ser y eso podría ayudar a pensar. eso
En primer lugar, es correcto que la enum
semántica es estrictamente superior a la struct
cuanto a lo que puede representar, y por lo tanto la struct
es algo redundante.
Sin embargo, hay otros elementos en juego aquí.
facilidad de uso: los valores dentro de una
enum
solo se pueden acceder (directamente) a través de la comparación; Contrasta con la facilidad de uso para acceder a un campo destruct
. Podría escribir accesores para todos y cada uno de los campos, pero eso es realmente engorroso.distinción: una
enum
es una unión etiquetada, unastruct
tiene un diseño fijo; A los programadores, en general, nos gusta poner etiquetas en las cosas y, por lo tanto, se pueden apreciar nombres diferentes para diferentes funciones.
Como yo lo veo, la struct
es, por lo tanto, azúcar sintáctica. Por lo general, prefiero magro y mezquino, pero un poco de azúcar puede hacer mucho para aumentar lo que puede representarse tersamente.