Un closure en Rust es una función anónima que puede capturar variables de su entorno. A diferencia de las funciones regulares, los closures pueden acceder a variables que están fuera de su propio alcance, lo que los hace muy útiles para ciertas tareas como operaciones en colecciones o programación funcional.
La sintaxis básica de un closure es:
let closure = |parametros| {
// cuerpo del closure
};
Los closures pueden capturar variables de tres formas:
1. Por referencia: Acceden a la variable sin tomar propiedad de ella.
2. Por muta referencia: Modifican la variable original.
3. Por valor: Toman posesión de la variable.
let sumar = |a, b| a + b;
println!("{}", sumar(2, 3)); // Imprime 5
En este ejemplo, sumar
es un closure que toma dos parámetros y retorna la suma de ambos.
Un closure puede capturar variables que están fuera de su propio alcance:
let x = 5;
let sumar_x = |y| y + x; // Captura la variable `x` del entorno
println!("{}", sumar_x(3)); // Imprime 8
Los closures son muy útiles con métodos como map
, filter
y for_each
en iteradores:
let numeros = vec![1, 2, 3, 4];
let numeros_doblados: Vec<i32> = numeros.iter().map(|x| x * 2).collect();
println!("{:?}", numeros_doblados); // Imprime [2, 4, 6, 8]
Un closure puede modificar variables capturadas si se define como mutable:
let mut contador = 0;
let mut incrementar = || {
contador += 1;
println!("Contador: {}", contador);
};
incrementar(); // Imprime "Contador: 1"
incrementar(); // Imprime "Contador: 2"
Un closure puede tomar posesión de una variable y consumirla:
let saludo = String::from("Hola");
let consumir = || {
println!("{}", saludo);
}; // El closure toma posesión de `saludo`
consumir();
// `saludo` ya no puede ser usado aquí
Para más detalles sobre cómo usar closures en Rust, visita la documentación oficial de Rust.
Jorge García
Fullstack developer