use std::rc::Rc; use std::fmt::Display; enum Node { Nil, Value(T, Rc>), } fn build_chain_str() -> Node { let mut chain = Node::::Nil; for &n in &["Tom", "Jerry", "Mike"] { let node = Node::::Value(n.into(), Rc::new(chain)); chain = node; } chain } fn build_chain_usize() -> Node { let mut chain = Node::::Nil; for &n in &[1, 2, 3, 4, 5] { let node = Node::::Value(n, Rc::new(chain)); chain = node; } chain } fn print_chain(chain: &Node) where T: Display { let mut ptr = chain; while let Node::Value(n, next) = ptr { print!("{}", n); ptr = next; if let &Node::::Value(_, _) = ptr { print!(" -> "); } } println!(); } fn main() { let chain = build_chain_str(); print_chain(&chain); let chain_usize = build_chain_usize(); print_chain(&chain_usize); }