rust unit-type

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