Avatar ·

¿Cuándo un closure implementa Fn, FnMut y FnOnce en Rust?

Soy nuevo en Rust y estoy tratando de entender los closures. Leí sobre los traits Fn, FnMut y FnOnce, pero no termino de comprender cuándo el compilador elige cuál de ellos. Escribí un pequeño ejemplo: ```rust fn main() { let x = 10; let print_x = || println!("{}", x); // Closure 1 let mut y = String::from("hello"); let append = || y.push_str(" world"); // Closure 2 let z = String::from("rust"); let consume = || drop(z); // Closure 3 } ``` ¿Por qué el primer closure funciona como Fn, el segundo como FnMut y el tercero como FnOnce? ¿Y cómo afecta esto a cuántas veces puedo llamar al closure? Si paso un closure a una función, ¿cómo sé qué trait espera? Agradecería una explicación con ejemplos. <<>>

Respuesta breve: todo depende de cómo el closure use las variables capturadas

El compilador de Rust determina automáticamente cuál de los tres traits implementa el closure, basándose en lo que hace con las variables capturadas del entorno.