enum Mylist { Empty, Cons(i32, std::rc::Rc) } impl Mylist { fn new() -> std::rc::Rc { std::rc::Rc::new(Mylist::Empty) } fn append(val: i32, l: std::rc::Rc) -> std::rc::Rc { std::rc::Rc::new(Mylist::Cons(val, l)) } } impl Drop for Mylist { fn drop(&mut self) { if let Mylist::Cons(v, _) = self { println!("Node with value {} is being destroyed!", v) } else { println!("An empty list is being destroyed!") } } } fn main() { let l1 = Mylist::new(); let l2 = Mylist::append(6, l1.clone()); { let l3 = Mylist::append(7, l2.clone()); if let Mylist::Cons(v, _) = *l3 { println!("l3: {}", v); } else { println!("l3 is empty!") } } if let Mylist::Cons(v, tail) = &*(l2.clone()) { println!("l2: {}", v); if let Mylist::Cons(v1, _) = &*tail.clone() { println!("l2's tail: {}", v1); } else { println!("l2's tail is empty!") }; } else { println!("l2 is empty!") }; }