ps4 - ¿Por qué Rust no tiene sindicatos?
rust traduccion (2)
Rust ha etiquetado a los sindicatos en la forma de sus tipos de datos algebraicos, enum
:
enum Foo {
Bar(i32),
Baz,
Quux {
misc: A,
ellaneous: B,
fields: C,
},
}
Un Foo
puede ser un Bar
con un i32
adjunto, un Baz
sin datos adicionales o un Quux
con esos tres campos misceláneos. Esta es una unión etiquetada: el tamaño de una enumeración no excederá la mayor de sus variantes más todo lo necesario para la etiqueta (normalmente un byte, pero supongo que es posible tener más variantes de las que caben en un byte), y en ciertos casos donde se puede optimizar (como la Option<&T>
donde una dirección de memoria de 0 no es legal para la variante Some
y así se puede usar para representar la variante None
), la variante se comprime en el valor.
Lo que Rust no tiene es uniones no etiquetadas como en C. ¿Por qué? Porque son fundamentalmente inseguros, y la seguridad es primordial para Rust. Si todavía quieres algo como eso, es perfectamente posible crear un envoltorio alrededor del código inseguro que terminarás con cosas como la transmutación, pero simplemente no necesitas uniones sin etiqueta en la vida normal.
Rust ahora admite uniones no etiquetadas como un concepto inseguro; a partir de 1.19.0 .
Puedo pensar en muchos lugares donde los sindicatos en C ayudan son útiles y ahorran memoria. Como Rust es un lenguaje de programación de sistema, ¿por qué no es compatible con los sindicatos?
Se agregaron uniones al lenguaje en ( RFC 1444 ), y son estables desde Rust 1.19.0 . Requieren el uso de bloques unsafe
.
Las uniones crudas no son seguras para la memoria (ya que no hay forma de que el compilador le garantice que siempre lea el tipo correcto (es decir, el tipo escrito más reciente) de la unión). Uno de los objetivos de Rust es crear un lenguaje de bajo nivel con seguridad de memoria; dado que los sindicatos no son compatibles con ese objetivo, no se incluyeron en Rust 1.0.
En cambio, Rust tiene enumeraciones , que proporcionan la mayoría de las ventajas de las uniones a cambio de un uso de memoria pequeño, pero que son seguras para la memoria ya que el valor de la enumeración siempre realiza un seguimiento de qué tipo particular contiene.