1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26
struct Defer<F: FnOnce()>(Option<F>); impl<F: FnOnce()> Drop for Defer<F> { fn drop(&mut self) { self.0.take().map(|f| f()); } } /// Defer execution of a closure until the return value is dropped. pub fn defer<F: FnOnce()>(f: F) -> impl Drop { Defer(Some(f)) } #[test] fn test() { use std::cell::RefCell; let i = RefCell::new(0); { let _d = defer(|| *i.borrow_mut() += 1); assert_eq!(*i.borrow(), 0); } assert_eq!(*i.borrow(), 1); }