Anuncios

Bienvenidos sean a este post, hoy hablaremos sobre los closures.

Anuncios

Los closures o cierres son funciones anonimas que se pueden almacenar en una variable o pasar como argumentos a otras funciones, esto nos permite crearlo en un lugar y despues llamarla para evaluarla en un contexto diferente, veamos como seria su sintaxis mas basica:

let variable_cierre = | <variable> | { instrucciones  ...};
Anuncios

La primero sera una declaracion de variable como cualquier otro, pero despues tenemos una variable entre dos pipes (|), esta sera una variable que podremos utilizar unicamente dentro del bloque de instrucciones, veamos un ejemplo simple:

let agregar = | num | { num + 1 };
Anuncios

Pero esta variable es opcional siendo que los dos pipes son los que delimitan al closure, al igual que en otros casos tambien se puede definir el tipo de la variable, vamos a hacer un ejemplo simple para verlo en accion, para ello crearemos un nuevo proyecto que llamaremos cierre, una vez creado modificaremos el codigo generado en main.rs con el siguiente:

main.rs

use std::thread;
use std::time::Duration;

fn rutina_ejercicio(i: u32, a: u32)
{
	let cierre = | num | {
		println!("Recalculando...");
		thread::sleep(Duration::from_secs(2));
		num
		};

	if i < 25
	{
		println!("Hoy haz {} sentadillas",
			cierre(i));
		println!("Despues haz {} sentadillas",
			cierre(i));
	} else {
		if a == 3
		{
			println!("Descansa un poco y recuerda hidratarte");
		} else {
			println!("Hoy corre por {} minutos",
				cierre(i));
		}
	}
}

fn main() 
{
	let valor_especificado = 22;
	let numero_al_azar = 5;

	rutina_ejercicio(
		valor_especificado,
		numero_al_azar
		);
}
Anuncios

Primero importaremos dos elementos, el primero sera para manipular un thread y el segundo es para establecer una duracion, ya veremos porque, despues definiremos una funcion que recibira dos valores, esta funcion sera para crear una rutina de ejercicio, lo primero que haremos dentro de esta funcion sera crear la siguiente variable:

	let cierre = | num | {
		println!("Recalculando...");
		thread::sleep(Duration::from_secs(2));
		num
		};
Anuncios

Observen que primero definimos una variable para contener nuestro closure al cual llamaremos cierre, declaramos una llamada num, en este definiremos un bloque donde mostraremos un mensaje en pantalla donde por medio de thread usaremos a sleep para generar una pausa y esta durara la que pasemos con Duration, una vez terminado devolveremos el valor que pasamos a num, esto es el closure continuemos con el codigo.

Anuncios

Lo siguiente sera un condicional donde verificamos si el valor de i es menor que 25 donde mostraremos dos mensajes y en ambos casos usaremos el closure llamado cierre y le pasaremos el valor almacenado en i, luego tenemos un else donde chequeamos si el valor de la otra variable es igual a tres, en caso de ser verdadero le diremos que pare de lo contrario le pedimos que corra la cantidad de minutos proporcional al valor de a, solo nos resta hablar de main donde crearemos dos variables con valores distintos, los siguiente sera llamar a la funcion anterior con los valores creados, compilemos y veamos su salida mediante el siguiente video

Anuncios

Observen como a pesar de s ser una simple variable nos permite ejecutar al metodo sleep para poder generar una pequeña pausa y hacer el efecto de que esta demorando el calculo.

Anuncios

En resumen, hoy hemos visto que son los closures o cierres, como es su sintaxis, como se compone, para que nos puede servir a traves de un breve ejemplo y como aplicarlo, espero les haya sido de utilidad 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