Avatar ·

Wann implementiert ein Closure Fn, FnMut und FnOnce in Rust?

Ich bin neu in Rust und versuche, Closures zu verstehen. Ich habe über die Traits Fn, FnMut und FnOnce gelesen, verstehe aber nicht ganz, wann der Compiler welchen auswählt. Ich habe ein kleines Beispiel geschrieben:\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\nWarum funktioniert das erste Closure als Fn, das zweite als FnMut und das dritte als FnOnce? Und wie beeinflusst das, wie oft ich das Closure aufrufen kann? Wenn ich ein solches Closure an eine Funktion übergebe, wie kann ich herausfinden, welchen Trait sie erwartet? Ich wäre dankbar für eine Erklärung mit Beispielen.