Quando um closure implementa as traits Fn, FnMut e FnOnce em Rust?
Olá, colegas! Comecei a estudar Rust e não consigo entender os closures. Na documentação diz que cada closure implementa automaticamente uma ou mais traits: `Fn`, `FnMut` e `FnOnce`. Mas não entendo do que isso depende.
Digamos que eu tenha um código simples:
```rust
let mut x = 5;
let add_to_x = |y| x += y; // closure que muta x
let print_x = || println!("{}", x); // closure que lê x
```
Por que `add_to_x` não pode ser usado como `Fn`, mas `print_x` pode? E quando um closure se torna `FnOnce`? Tentei passar closures para funções com diferentes restrições de traits, e o compilador reclama que a trait não foi implementada.
Vocês podem explicar de forma simples como o compilador Rust decide qual trait implementar para um closure? E como isso afeta o