¿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.