Como parámetros de salida

Las clausuras como parámetros de entrada son posibles, por lo que también debería ser posible devolver clausuras como parámetros de salida. Sin embargo, los tipos de clausuras anónimas son, por definición, desconocidos, por lo que tenemos que usar impl Trait para devolverlos.

Los rasgos válidos para devolver un cierre son:

  • Fn
  • FnMut
  • FnOnce

Más allá de esto, se debe usar la palabra clave move, que indica que todas las capturas ocurren por valor. Esto es necesario porque cualquier captura por referencia se eliminaría tan pronto como la función saliera, dejando referencias no válidas en la clausura.

fn crea_fn() -> impl Fn() {
    let texto = "Fn".to_owned();

    move || println!("Esta es una: {}", texto)
}

fn crea_fnmut() -> impl FnMut() {
    let texto = "FnMut".to_owned();

    move || println!("Esta es una: {}", texto)
}

fn crea_fnonce() -> impl FnOnce() {
    let texto = "FnOnce".to_owned();

    move || println!("Esta es una: {}", texto)
}

fn main() {
    let fn_simple = crea_fn();
    let mut fn_mut = crea_fnmut();
    let fn_once = crea_fnonce();

    fn_simple();
    fn_mut();
    fn_once();
}

Ve también:

Fn, FnMut.