use std::{rc::Rc, fmt::Debug, sync::Arc}; #[derive(Debug, Clone)] struct Object { name: String, } trait Shape: Debug {} impl Shape for Object {} fn main() { { let boxed = Box::new(Object { name: "Boxed".to_owned(), }); let arc = Arc::new(Object { name: "Arced".to_owned(), }); let rc = Rc::new(Object { name: "Rced".to_owned(), }); let _1 = arc.clone(); let _2 = rc.clone(); let _3 = Arc::downgrade(&arc); let _4 = Arc::downgrade(&arc); let _5 = rc.clone(); let _6 = Rc::downgrade(&rc); dbg!(&boxed); dbg!(&arc); dbg!(&rc); println!(); } { let obj = Object { name: "Don't care".to_owned(), }; let boxed: Box = Box::new(obj.clone()); let arc: Arc = Arc::new(obj.clone()); let rc: Rc = Rc::new(obj.clone()); let obj: &dyn Shape = &obj; dbg!(&boxed); dbg!(&arc); dbg!(&rc); dbg!(&obj); println!(); } }