struct Cacher where T: Fn(u32) -> u32, { calculation: T, value: Option, } impl Cacher where T: Fn(u32) -> u32, { fn new(calculation: T) -> Cacher { Cacher { calculation, value: None, } } fn value(&mut self, arg: u32) -> u32 { match self.value { Some(v) => v, None => { let v = (self.calculation)(arg); self.value = Some(v); v } } } } #[cfg(test)] mod tests { use super::*; // ANCHOR: here #[test] fn call_with_different_values() { let mut c = Cacher::new(|a| a); let v1 = c.value(1); let v2 = c.value(2); assert_eq!(v2, 2); } // ANCHOR_END: here }