Cons(i32, RefCell<Rc<List>>),
                  
                  
                      Nil,
                  
                  
                  }
                  
                  
                  
                  
                  
                  impl List {
                  
                  
                      fn tail(&self) -> Option<&RefCell<Rc<List>>> {
                  
                  
                          match self {
                  
                  
                              Cons(_, item) => Some(item),
                  
                  
                              Nil => None,
                  
                  
                          }
                  
                  
                      }
                  
                  
                  }
                  
                  
                  
                  
                  
                  fn main() {
                  
                  
                      let a = Rc::new(Cons(5, RefCell::new(Rc::new(Nil))));
                  
                  
                  
                  
                  
                      println!("a initial rc count = {}", Rc::strong_count(&a));
                  
                  
                      println!("a next item = {:?}", a.tail());
                  
                  
                  
                  
                  
                      let b = Rc::new(Cons(10, RefCell::new(Rc::clone(&a))));
                  
                  
                  
                  
                  
                      println!("a rc count after b creation = {}", Rc::strong_count(&a));
                  
                  
                      println!("b initial rc count = {}", Rc::strong_count(&b));
                  
                  
                      println!("b next item = {:?}", b.tail());
                  
                  
                  
                  
                  
                      if let Some(link) = a.tail() {
                  
                  
                          *link.borrow_mut() = Rc::clone(&b);
                  
                  
                      }
                  
                  
                  
                  
                  
                      println!("b rc count after changing a = {}", Rc::strong_count(&b));
                  
                  
                      println!("a rc count after changing a = {}", Rc::strong_count(&a));
                  
                  
                  
                  
                  
                      // Uncomment the next line to see that we have a cycle;
                  
                  
                      // it will overflow the stack
                  
                  
                      // println!("a next item = {:?}", a.tail());
                  
                  
                  }
                  
                  
                
RefCell<Rc> назвать незаметным сложно
trait Node<T> {} #[derive(Debug)] struct Nil; impl<T> Node<T> for Nil {} #[derive(Debug)] struct LinkedList<T, U: Node<T>> { head: T, tail: U, } fn nil() -> Nil { Nil {} } fn cons<T, U: Node<T>>(head: T, tail: U) -> LinkedList<T, U> { LinkedList { head, tail } } impl<T, U: Node<T>> Node<T> for LinkedList<T, U> {} fn main() { let list = cons(10, cons(20, nil())); println!("{:?}", list); } написал такой без рц и никаких стаковерфлоу
Обсуждают сегодня