¿Cuál es el propósito del tipo de unidad en Rust?
unit-type (2)
El óxido tiene el tipo de unidad , ()
, un tipo con un solo valor de tamaño cero. El valor de este tipo de unidad también se especifica usando ()
.
¿Cuál es el propósito del tipo de unidad y su valor? ¿Es un mecanismo para evitar el uso de nulos (o nulos ) como lo han hecho otros idiomas?
Si viene de un lenguaje similar a C (C, C ++, Java, etc.), puede pensar que la unidad es como un void
. Es el tipo que devuelve cuando no desea devolver nada.
Los teóricos del tipo señalarán que la unidad no es como nula, porque la unidad tiene exactamente 1 valor, mientras que la nula tiene 0 valores.
En la práctica, la cantidad de información que puede almacenar en ambos tipos es la misma (0 bits), aunque los idiomas que usan la unidad tienden a ser más agradables, ya que puede tratarla como cualquier otro valor.
Puede almacenarlo en una variable, estructura, colección o en cualquier otro lugar donde pueda almacenar un valor. Puede pasar como argumento o devolverlo como resultado. Puede crear una referencia a ella. Etc.
Entonces, ¿cuándo es eso útil? Principalmente cuando no te importa con qué tipo de valor estás tratando. Significa que puede escribir código polimórfico / genérico sin tener que preocuparse de si el valor con el que está tratando realmente contiene información, es decir, no es necesario un caso especial para almacenar datos reales o ()
.
Un ejemplo de dónde se usa esto es en HashSet
. Un HashSet<T>
realidad se implementa como una envoltura delgada alrededor de HashMap<T, ()>
. (Un mapa del tipo genérico T
a ()
)
()
es un valor del tipo ()
y su propósito es ser inútil.
Todo en Rust es una expresión, y las expresiones que devuelven "nada" devuelven ()
. El compilador dará un error si tiene una función sin un tipo de retorno, pero de todos modos devuelve algo que no sea ()
. Por ejemplo
fn f() {
1i // error: mismatched types: expected `()` but found `int`
}
Hay usos prácticos para ()
también. A veces no nos importa un tipo genérico, y ()
hace explícito.
Por ejemplo, un Result<(), String>
se puede usar como tipo de retorno para una función que se completa con éxito o falla por una variedad de razones.