Guest User

Untitled

a guest
Jun 21st, 2018
72
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.16 KB | None | 0 0
  1. use std::fmt::Display;
  2.  
  3. trait W {
  4. fn write(&mut self, s: &str);
  5.  
  6. fn write_fmt<F: Display>(&mut self, f: &F) where Self: Sized {
  7. let s = f.to_string();
  8. self.write(&s);
  9. }
  10. }
  11.  
  12. trait Combo: W {
  13. fn write_fmt_erased(&mut self, f: &Display);
  14. }
  15.  
  16. impl<T: ?Sized + W> W for Box<T> {
  17. fn write(&mut self, s: &str) {
  18. (**self).write(s);
  19. }
  20. }
  21.  
  22. struct Moo;
  23.  
  24. impl W for Moo {
  25. fn write(&mut self, s: &str) {
  26. println!("moo: {}", s);
  27. }
  28.  
  29. fn write_fmt<F: Display>(&mut self, f: &F) {
  30. println!("MOOOOOOO: {}", f);
  31. }
  32. }
  33.  
  34. impl Combo for Moo {
  35. fn write_fmt_erased(&mut self, f: &Display) {
  36. println!("erased ->");
  37. self.write_fmt(&f);
  38. }
  39. }
  40.  
  41. struct Cage {
  42. w: Box<Combo>,
  43. }
  44.  
  45. impl W for Cage {
  46. fn write(&mut self, s: &str) {
  47. println!("caged!");
  48. self.w.write(s);
  49. }
  50.  
  51. fn write_fmt<F: Display>(&mut self, f: &F) {
  52. println!("caged!");
  53. self.w.write_fmt_erased(f);
  54. }
  55. }
  56.  
  57. fn main() {
  58. let mut moo = Moo;
  59. moo.write("hello");
  60. moo.write_fmt(&"sup");
  61.  
  62. let mut cage = Cage { w: Box::new(moo) };
  63. cage.write("hello");
  64. cage.write_fmt(&"sup");
  65. }
Add Comment
Please, Sign In to add comment