La palabra reservada type
te permite declarar un alias a otro tipo:
type Nombre = String;
Ahora, puedes usar este tipo como si fuera un tipo real:
fn main() { type Name = String; let x: Nombre = "Hola".to_string(); }type Name = String; let x: Nombre = "Hola".to_string();
Sin embargo, nota, que es un alias, no un nuevo tipo. En otras palabras, debido a que Rust es fuertemente tipificado, podrías esperar que una comparación entre dos tipos diferentes falle:
fn main() { let x: i32 = 5; let y: i64 = 5; if x == y { // ... } }let x: i32 = 5; let y: i64 = 5; if x == y { // ... }
lo anterior, produce:
error: mismatched types:
expected `i32`,
found `i64`
(expected i32,
found i64) [E0308]
if x == y {
^
Pero, si tuviéramos un alias:
fn main() { type Num = i32; let x: i32 = 5; let y: Num = 5; if x == y { // ... } }type Num = i32; let x: i32 = 5; let y: Num = 5; if x == y { // ... }
Compilaría sin errores. Valores de un tipo Num
son lo mismo que un valor de tipo i32
, en todos los aspectos.
Puedes también hacer uso de alias de tipos en genéricos:
fn main() { use std::result; enum ErrorConcreto { Foo, Bar, } type Result<T> = result::Result<T, ErrorConcreto>; }use std::result; enum ErrorConcreto { Foo, Bar, } type Result<T> = result::Result<T, ErrorConcreto>;
El código anterior, crea una version especializada de el tipo Result
, la cual posee siempre un ErrorConcreto
para la parte E
de Result<T, E>
. Esta practica es usada comúnmente en la biblioteca estándar para la creación de errores personalizados para cada sub-seccion. Por ejemplo, io::Result.