Avatar ·

Quando um closure implementa Fn, FnMut e FnOnce em Rust?

Sou novo em Rust e estou tentando entender closures. Li sobre os traits Fn, FnMut e FnOnce, mas não compreendo completamente quando o compilador escolhe cada um. Escrevi um pequeno exemplo:\n\n```rust\nfn main() {\n let x = 10;\n let print_x = || println!("{}", x); // Closure 1\n let mut y = String::from("hello");\n let append = || y.push_str(" world"); // Closure 2\n let z = String::from("rust");\n let consume = || drop(z); // Closure 3\n}\n```\n\nPor que o primeiro closure funciona como Fn, o segundo como FnMut e o terceiro como FnOnce? E como isso afeta quantas vezes posso chamar o closure? Se eu passar esse closure para uma função, como saber qual trait ela espera? Agradeço uma explicação com exemplos.