Go 中的 defer
非常实用。今天尝试在 Rust 中模拟 defer
。
Rust 和 C++ 一样采用 RAII 的方式管理资源,需要 defer
的场景并不多。
Rust 没有 defer
, 不过可以通过实现 Drop trait
,利用 RAII 机制简单模拟一下 defer
。
大致思路:
- 需要延期执行的代码放入闭包
- 创建结构体持有闭包
- 为该结构体类型实现
Drop
,在drop
中调用闭包。
这样,在该类型作用域结束时,drop
被调用,进而执行闭包中的逻辑。
具体实现:
pub struct Defer<T: FnOnce()> {
h: Option<T>,
}
impl<T: FnOnce()> Drop for Defer<T> {
fn drop(&mut self) {
self.h.take().map(|f| f()).unwrap_or(());
}
}
pub fn defer(func: impl FnOnce()) -> Defer<impl FnOnce()> {
Defer { h: Some(func) }
}
fn main() {
let _guard = defer(|| {
println!("main funcion finished");
});
println!("Hello world!");
}
参考文档: