Introducción
En este laboratorio, aprendemos que las closures pueden usarse como parámetros de entrada y también pueden devolverse como parámetros de salida al utilizar impl Trait y especificar los traits válidos (Fn, FnMut, FnOnce). La palabra clave move se utiliza para indicar que todas las capturas se realizan por valor, evitando referencias inválidas.
Nota: Si el laboratorio no especifica un nombre de archivo, puede usar cualquier nombre de archivo que desee. Por ejemplo, puede usar
main.rs, compilar y ejecutarlo conrustc main.rs &&./main.
Como parámetros de salida
Es posible utilizar closures como parámetros de entrada, por lo que también debería ser posible devolver closures como parámetros de salida. Sin embargo, los tipos de closures anónimos son, por definición, desconocidos, por lo que tenemos que utilizar impl Trait para devolverlos.
Los traits válidos para devolver una closure son:
FnFnMutFnOnce
Además de esto, se debe utilizar la palabra clave move, lo que indica que todas las capturas se realizan por valor. Esto es necesario porque cualquier captura por referencia se perdería tan pronto como la función saliera, dejando referencias inválidas en la closure.
fn create_fn() -> impl Fn() {
let text = "Fn".to_owned();
move || println!("This is a: {}", text)
}
fn create_fnmut() -> impl FnMut() {
let text = "FnMut".to_owned();
move || println!("This is a: {}", text)
}
fn create_fnonce() -> impl FnOnce() {
let text = "FnOnce".to_owned();
move || println!("This is a: {}", text)
}
fn main() {
let fn_plain = create_fn();
let mut fn_mut = create_fnmut();
let fn_once = create_fnonce();
fn_plain();
fn_mut();
fn_once();
}
Resumen
¡Felicitaciones! Has completado el laboratorio de Parámetros de Salida. Puedes practicar más laboratorios en LabEx para mejorar tus habilidades.