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 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46
#![no_std] use core::ops::{Drop, FnOnce}; pub struct Finally<F> where F: FnOnce(), { f: Option<F>, } impl<F> Drop for Finally<F> where F: FnOnce(), { fn drop(&mut self) { if let Some(f) = self.f.take() { f() } } } pub fn finally<F>(f: F) -> Finally<F> where F: FnOnce(), { Finally { f: Some(f) } } #[cfg(test)] mod tests { use super::finally; use core::sync::atomic::{AtomicUsize, Ordering}; #[test] fn executed_on_drop() { let a = AtomicUsize::new(0); { let _f = finally(|| { a.fetch_add(1, Ordering::SeqCst); }); assert_eq!(0, a.load(Ordering::SeqCst)); } assert_eq!(1, a.load(Ordering::SeqCst)); } }