#![allow(unused_variables)] use std::rc::Rc; use std::rc::Weak; use std::cell::RefCell; struct Owner { name: String, gadgets: RefCell>>, } struct Gadget { id: i32, owner: Rc, } fn main() { let gadget_owner: Rc = Rc::new(Owner { name: "Gadget Man".to_string(), gadgets: RefCell::new(vec![]), }); let gadget1 = Rc::new(Gadget { id: 1, owner: Rc::clone(&gadget_owner), }); let gadget2 = Rc::new(Gadget { id: 2, owner: Rc::clone(&gadget_owner), }); { let mut gadgets = gadget_owner.gadgets.borrow_mut(); gadgets.push(Rc::downgrade(&gadget1)); gadgets.push(Rc::downgrade(&gadget2)); } for gadget_weak in gadget_owner.gadgets.borrow().iter() { let gadget = gadget_weak.upgrade().unwrap(); println!("Gadget {} owned by {}", gadget.id, gadget.owner.name); } }