use std::rc::Rc; use std::ops::Deref; type CallBack = Fn(f32) -> f32; struct Caller where T: Deref> { call_back: T, } impl Caller where T: Deref> { fn new(call_back: T) -> Caller { Caller {call_back: call_back} } fn call(&self, x: f32) -> f32 { (*self.call_back)(x) } } fn main() { let caller = { // function is used by `Caller` and `main()` => shared resource // solution: `Rc` let func_obj = Box::new(|x: f32| 2.0 * x) as Box; let func = Rc::new(func_obj); let caller = Caller::new(func.clone()); // we also want to use func now let _y = func(3.0); caller }; // func survives because it is referenced through a `Box` in `caller` let y = caller.call(1.0); assert_eq!(y, 2.0); }