Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- use std::rc::Rc;
- use std::rc::Weak;
- use std::cell::RefCell;
- use std::fmt;
- struct Owner {
- name: String,
- gadgets: RefCell<Vec<Weak<Gadget>>>,//must be Weak instead Rc to avoid cyclic reference
- }
- trait Maker{
- fn make_gadget(&self, id: i32) -> Rc<Gadget>;
- }
- impl Maker for Rc<Owner> {
- fn make_gadget(&self, id: i32) -> Rc<Gadget> {
- let gadget = Rc::new(Gadget{id: id, owner: self.clone()});
- self.gadgets.borrow_mut().push(Rc::downgrade(&gadget));
- gadget
- }
- }
- impl fmt::Debug for Owner {
- fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
- write!(f, "Owner {{ name: {}, gadgets: {:?} }}", self.name, self.gadgets.into_inner())
- }
- }
- #[derive(Debug)]
- struct Gadget {
- id: i32,
- owner: Rc<Owner>,
- }
- fn main() {
- let gadget_owner : Rc<Owner> = Rc::new(
- Owner {
- name: "Gadget Man".to_string(),
- gadgets: RefCell::new(Vec::new()),
- }
- );
- let gadget1 = gadget_owner.make_gadget(1);
- let gadget2 = gadget_owner.make_gadget(2);
- println!("gadget1 is: {:?}", gadget1);
- println!("gadget2 is: {:?}", gadget2);
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement