Rust中的惯用回调:如何正确传递函数和闭包
大家好,同事们!我在C++之后开始学习Rust,但不知道如何正确地实现回调。在C++中,我只是传递std::function或函数指针。而在这里,所有权和生命周期更加严格。
问题:我想编写一个简单的事件处理器。有一个Button结构体,它应该在按下时调用用户自定义函数。在C++中,我会这样做:
```cpp
struct Button {
std::function onClick;
void press() { if(onClick) onClick(); }
};
```
尝试用Rust重写:
```rust
struct Button {
callback: fn(), // 尝试使用函数指针
}
impl Button {
fn press(&self) {
(self.callback)();
}
}
```
这只适用于普通函数,但不适用于捕获变量的闭包。如果我写:
```rust
let mut count = 0;
let button = Button {
callback: || { count += 1; } // 错误!类型不匹配
};
```
编译器报错:“expected fn item, found closure”。我读过关于Box