Guest User

Untitled

a guest
May 22nd, 2018
70
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 0.95 KB | None | 0 0
  1. use std::cell::{Ref, RefCell};
  2. use std::fmt::Debug;
  3. use std::rc::Rc;
  4.  
  5. #[derive(Debug)]
  6. struct First {}
  7.  
  8. #[derive(Debug)]
  9. struct Second {}
  10.  
  11. #[derive(Debug)]
  12. enum TestEnum {
  13. First(First),
  14. Second(Second),
  15. }
  16.  
  17. #[derive(Debug)]
  18. struct FirstWrapper<'a> {
  19. first: &'a First,
  20. }
  21.  
  22. #[derive(Debug)]
  23. struct SecondWrapper<'a> {
  24. second: &'a Second,
  25. }
  26.  
  27. trait Wrapper<'a> : Debug {}
  28.  
  29. impl<'a> Wrapper<'a> for FirstWrapper<'a> {}
  30. impl<'a> Wrapper<'a> for SecondWrapper<'a> {}
  31.  
  32. fn wrap<'a>(val: &'a Ref<'a, TestEnum>) -> Box<Wrapper<'a> + 'a> {
  33. match &**val {
  34. &TestEnum::First(ref first) => Box::new(FirstWrapper { first }),
  35. &TestEnum::Second(ref second) => Box::new(SecondWrapper { second }),
  36. }
  37. }
  38.  
  39. fn main() {
  40. let vec: Vec<Rc<RefCell<TestEnum>>> = vec![];
  41.  
  42. let borrowed: Vec<_> = vec.iter().map(|i| i.borrow()).collect();
  43. let refs: Vec<Box<Wrapper>> = borrowed.iter().map(|b| wrap(b)).collect::<Vec<_>>();
  44.  
  45. println!("{:?}", refs);
  46. }
Add Comment
Please, Sign In to add comment