Idiomatische Callbacks in Rust: Wie man Funktionen und Closures richtig übergibt
Hallo Kollegen! Ich habe angefangen, Rust nach C++ zu lernen, und verstehe nicht, wie man Callbacks richtig macht. In C++ habe ich einfach std::function oder einen Funktionszeiger übergeben. Hier ist alles strenger mit Besitz und Lebenszeit.
Problem: Ich möchte einen einfachen Event-Handler schreiben. Es gibt eine Struct Button, die beim Drücken eine benutzerdefinierte Funktion aufrufen soll. In C++ würde ich das so machen:
```cpp
struct Button {
std::function onClick;
void press() { if(onClick) onClick(); }
};
```
Ich versuche, das in Rust zu übersetzen:
```rust
struct Button {
callback: fn(), // ich probiere einen Funktionszeiger
}
impl Button {
fn press(&self) {
(self.callback)();
}
}
```
Das funktioniert nur für normale Funktionen, aber nicht für Closures, die Variablen einfangen. Wenn ich schreibe:
```rust
let mut count = 0;
let button = Button {
callback: || { count += 1; } // Fehler! Typ stimmt nicht
};
```
Der Compiler meckert: "expected fn item, found closure". Ich habe über Box