closure 和回调
C 里写回调,最常见的形状是函数指针加上下文指针:
typedef void (*event_cb_t)(void *ctx, int event);
void register_event(event_cb_t cb, void *ctx);
cb 是要调用的函数,ctx 是调用时带回来的环境。这个模式很成熟,但也有老问题:
ctx的真实类型靠约定ctx活多久靠约定- 回调会不会修改环境靠约定
- 回调会不会只调用一次靠约定
- 多线程调用时是否安全靠约定
Rust 的 closure 解决的是同一个问题:把“要执行的代码”和“它需要的环境”放在一起。
阅读更多