From 9347fea0520a941db1a70b53098b333db4830ed5 Mon Sep 17 00:00:00 2001 From: Timothy Warren Date: Tue, 5 Feb 2019 10:44:22 -0500 Subject: [PATCH] Update reference_counting example to have a shared mutable value --- reference_counting/src/main.rs | 29 +++++++++++++++++++---------- 1 file changed, 19 insertions(+), 10 deletions(-) diff --git a/reference_counting/src/main.rs b/reference_counting/src/main.rs index 1ea8326..4057280 100644 --- a/reference_counting/src/main.rs +++ b/reference_counting/src/main.rs @@ -1,19 +1,28 @@ +#[derive(Debug)] enum List { - Cons(i32, Rc), + Cons(Rc>, Rc), Nil, } use List::{Cons, Nil}; use std::rc::Rc; +use std::cell::RefCell; fn main() { - let a = Rc::new(Cons(5, Rc::new(Cons(10, Rc::new(Nil))))); - println!("count after creating a = {}", Rc::strong_count(&a)); - let _b = Cons(3, Rc::clone(&a)); - println!("count after creating b = {}", Rc::strong_count(&a)); - { - let _c = Cons(4, Rc::clone(&a)); - println!("count after creating c = {}", Rc::strong_count(&a)); - } - println!("count after c goes out of scope = {}", Rc::strong_count(&a)); + let value = Rc::new(RefCell::new(5)); + + let a = Rc::new(Cons(Rc::clone(&value), Rc::new(Nil))); + println!("a before = {:?}", a); + + let b = Cons(Rc::new(RefCell::new(6)), Rc::clone(&a)); + println!("b before = {:?}", b); + + let c = Cons(Rc::new(RefCell::new(10)), Rc::clone(&a)); + println!("c before = {:?}", a); + + *value.borrow_mut() += 10; + + println!("a after = {:?}", a); + println!("b after = {:?}", b); + println!("c after = {:?}", c); }