Anuncios

Bienvenidos sean a este post, hoy hablaremos sobre una instruccion particular.

Anuncios

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
};
Anuncios

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;
Anuncios

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
}
Anuncios

Pero para recuperar la informacion no es tan simple como sucede en C, para verlo en accion vamos a crear un nuevo proyecto.

Anuncios

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)
}
Anuncios

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
Anuncios

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;
Anuncios

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());
Anuncios
Anuncios

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;
	}
Anuncios
Anuncios

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$
Anuncios
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.
Anuncios

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.

Anuncios

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.

Anuncios
pp258

Donación

Es para mantenimento del sitio, gracias!

$1.50