Bienvenidos sean a este post, hoy hablaremos sobre una instruccion particular.
Esta instruccion es muy similar a la existente en C donde la utilizamos para enumerar constantes, veamos el siguiente ejemplo:
enum numerado
{
a = 5,
b,
c,
d = 999
};
En este caso tenemos una constante llamada a con el valor de 5, la siguiente que es b tendra el valor de a + 1, la siguiente a este tendra el valor de a + 2, y asi sucesivamente, en este caso lo cortamos cuando a la constante d le asignamos el valor de 999, si no informaramos ningun valor en la primera constante tomara el valor de 0 y lo comenzara a incrementar desde este, por ultimo para recuperar uno de los valores debemos usar:
numerado.b;
El enum en Rust es muy similar pero nos permite todo tipo de variables, ya sean las simples, tuple o struct, les paso un ejemplo de sintaxis:
enum numerado
{
TipoTuple(f32, i64, &str),
TipoStruct{ var1: i32, var2: f32},
TipoNuevoTuple(f32),
variable
}
Pero para recuperar la informacion no es tan simple como sucede en C, para verlo en accion vamos a crear un nuevo proyecto.
En este caso crearemos un nuevo proyecto que llamaremos enums, una vez creado debemos ir al archivo main.rs y modificaremos el codigo generado por el siguiente:
main.rs
enum Numerado1
{
TipoTuple(f32, i32, String),
TipoStruct { var1: i32, var2: f32 },
StructTuple(i32),
Variable
}
enum Numerado2
{
TipoTuple(f32, i32, String),
TipoStruct { var1: i32, var2: f32 },
StructTuple(i32),
}
fn main()
{
let mut texto1 = "".to_owned();
let mut texto2 = "".to_owned();
let mut num1 = 0f32;
let valor = Numerado1::TipoTuple(3.14, 1, "Hola".to_owned());
let valor2 = Numerado2::TipoTuple(3.14, 0, "Mundo".to_owned());
if let Numerado1::TipoTuple(f,i,s) = valor
{
texto1 = s;
num1 = f;
}
if let Numerado2::TipoTuple(f,i,s) = valor2
{
texto2 = s;
}
println!("{}, {}! del hombre {}", texto1, texto2, num1)
}
En este codigo crearemos dos enum, el primero contendra cuatro elementos para almacenar informacion:
- El primero uno de tipo Tuple
- El segundo uno de tipo Struct
- El tercero sera de tipo Struct Tuple pero de nuevo tipo con un solo argumento
- El cuarto sera solo una variable
Cada uno almacenara sus datos en particular, pasando el segundo enum veremos que es casi lo mismo pero con la diferencia de que no tendra a la ultima variable del enum anterior, pasando al cuerpo del main tendremos primero la definicion de estas tres variables:
let mut texto1 = "".to_owned();
let mut texto2 = "".to_owned();
let mut num1 = 0f32;
Basicamente tendremos dos variables que las usaremos para almacenar texto y la ultima para almacenar un valor de tipo float, para el caso de texto no podemos pasar simplemente las comillas sino que debemos usar en complemento la funcion to_owned para que el compilador las interprete como cadenas, de esto hablamos en este post, luego tendremos el siguiente bloque:
let valor = Numerado1::TipoTuple(3.14, 1, "Hola".to_owned());
let valor2 = Numerado2::TipoTuple(3.14, 0, "Mundo".to_owned());
Aqui definimos dos variables para almacenar en cada uno de ellos el objeto que podemos generar desde el elemento que se encuentra en los enum, en este caso usaremos a TipoTuple, observen que pasamos los datos y para evitar conflictos al momento de compilarlo en las cadenas que pasamos usamos nuevamente a to_owned, si se preguntan porque debemos hacerlo asi, es porque sino informamos correctamente el path desde donde ubicarlo este nos puede devolver que es inalcanzable, despues tenemos dos condicionales, analicemos uno de ellos:
if let Numerado1::TipoTuple(f,i,s) = valor
{
texto1 = s;
num1 = f;
}
Observen esta curiosidad, aqui pasamos un let seguido del tipo tuple de Numerado1 y en los argumentos pasamos los tipos que debe buscar luego usamos el objeto almacenado en valor para compararlos, si los tipos creados en valor coinciden con los anteriores se procede a ejecutar el bloque, en este caso para texto1 le pasaremos el valor en s (string), y en num1 pasaremos el valor de f (float), el siguiente condicional es igual pero en lugar de usar a Numerado1 utiliza a Numerado2 y en lugar de valor usa a valor2, y lo unico que hacemos es asignar el valor de s a texto2, lo ultimo que haremos sera mostrar los valores que asignamos a las tres variables del cuerpo, vamos a compilarlo y ver como es su salida:
Finished dev [unoptimized + debuginfo] target(s) in 0.02s
Running `target/debug/enums`
Hola, Mundo! del hombre 3.14
tinchicus@dbn001vrt:~/lenguajes/rust/nuevotipo/enums$
Nota: Al momento de compilarlo dara algunos errores pero no se preocupen porque son solo avisos de partes del codigo que no usamos o construimos.
En este caso vemos como funciono pero esto nos resultara mas util para cuando hablemos del siguiente tema como es la explicacion del porque if let, como se llama y para que sirve pero de eso hablaremos en el proximo post.
En resumen, hoy hemos visto enum, su similitud con el de C pero tambien sus amplias diferencias, asi como tambien hemos visto en un ejemplo como se manipula la informacion en los mismos y como podemos recuperarla, espero les haya sido util sigueme en tumblr, Twitter o Facebook para recibir una notificacion cada vez que subo un nuevo post en este blog, nos vemos en el proximo post.


Donación
Es para mantenimento del sitio, gracias!
$1.50
