Advertisement
Guest User

code1

a guest
Apr 3rd, 2016
161
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Rust 1.16 KB | None | 0 0
  1. use std::rc::Rc;
  2. use std::rc::Weak;
  3. use std::cell::RefCell;
  4. use std::fmt;
  5.  
  6. struct Owner {
  7.     name: String,
  8.     gadgets: RefCell<Vec<Weak<Gadget>>>,//must be Weak instead Rc to avoid cyclic reference
  9. }
  10.  
  11. trait Maker{
  12.     fn make_gadget(&self, id: i32) -> Rc<Gadget>;
  13. }
  14.  
  15. impl Maker for Rc<Owner> {
  16.     fn make_gadget(&self, id: i32) -> Rc<Gadget> {
  17.         let gadget = Rc::new(Gadget{id: id, owner: self.clone()});
  18.         self.gadgets.borrow_mut().push(Rc::downgrade(&gadget));
  19.         gadget
  20.     }
  21. }
  22.  
  23. impl fmt::Debug for Owner {
  24.     fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
  25.         write!(f, "Owner {{ name: {}, gadgets: {:?} }}", self.name, self.gadgets.into_inner())
  26.     }
  27. }
  28.  
  29. #[derive(Debug)]
  30. struct Gadget {
  31.     id: i32,
  32.     owner: Rc<Owner>,
  33. }
  34.  
  35. fn main() {
  36.     let gadget_owner : Rc<Owner> = Rc::new(
  37.             Owner {
  38.                 name: "Gadget Man".to_string(),
  39.                 gadgets: RefCell::new(Vec::new()),
  40.             }
  41.         );
  42.  
  43.     let gadget1 = gadget_owner.make_gadget(1);
  44.     let gadget2 = gadget_owner.make_gadget(2);
  45.     println!("gadget1 is: {:?}", gadget1);
  46.     println!("gadget2 is: {:?}", gadget2);
  47. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement