Wann implementiert ein Closure die Traits Fn, FnMut und FnOnce in Rust?
Hallo Kollegen! Ich habe angefangen, Rust zu lernen, und komme mit Closures nicht klar. In der Dokumentation steht, dass jedes Closure automatisch einen oder mehrere Traits implementiert: `Fn`, `FnMut` und `FnOnce`. Aber ich verstehe nicht, wovon das abhängt.
Nehmen wir an, ich habe diesen einfachen Code:
```rust
let mut x = 5;
let add_to_x = |y| x += y; // Closure, das x mutiert
let print_x = || println!("{}", x); // Closure, das x liest
```
Warum kann `add_to_x` nicht als `Fn` verwendet werden, aber `print_x` schon? Und wann wird ein Closure zu `FnOnce`? Ich habe versucht, Closures an Funktionen mit verschiedenen Trait-Einschränkungen zu übergeben, und der Compiler meckert, dass der Trait nicht implementiert ist.
Könnt ihr mir einfach erklären, wie der Rust-Compiler entscheidet, welchen Trait ein Closure implementiert? Und wie wirkt sich das auf die Nutzung aus?