Guest User

Untitled

a guest
Jun 21st, 2018
81
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.64 KB | None | 0 0
  1. use std::ops::Add;
  2.  
  3. struct A;
  4. struct B;
  5.  
  6. impl Add<B> for A {
  7. type Output = &'static str;
  8.  
  9. fn add(self, _: B) -> &'static str {
  10. "A + B"
  11. }
  12. }
  13.  
  14. impl<'a> Add<&'a B> for A {
  15. type Output = &'static str;
  16.  
  17. fn add(self, _: &'a B) -> &'static str {
  18. "A + &B"
  19. }
  20. }
  21.  
  22. impl<'a> Add<B> for &'a A {
  23. type Output = &'static str;
  24.  
  25. fn add(self, _: B) -> &'static str {
  26. "&A + B"
  27. }
  28. }
  29.  
  30. impl<'a, 'b> Add<&'b B> for &'a A {
  31. type Output = &'static str;
  32.  
  33. fn add(self, _: &'b B) -> &'static str {
  34. "&A + &B"
  35. }
  36. }
  37.  
  38. struct Sneaky;
  39.  
  40. impl Add for Sneaky {
  41. type Output = &'static str;
  42.  
  43. fn add(self, _: Sneaky) -> &'static str {
  44. "Sneaky + Sneaky"
  45. }
  46. }
  47.  
  48. impl Sneaky {
  49. fn add(self, _: Sneaky) -> &'static str {
  50. "Boo!"
  51. }
  52. }
  53.  
  54. fn main() {
  55. let a = &A;
  56. let b = &B;
  57.  
  58. println!("{}", A + B);
  59. println!("{}", A.add(B));
  60. println!("{}", Add::add(A, B));
  61. println!("{}", <A as ::std::ops::Add<B>>::add(A, B));
  62.  
  63. println!("{}", A + b);
  64. println!("{}", A.add(b));
  65. println!("{}", Add::add(A, b));
  66. println!("{}", <A as ::std::ops::Add<&B>>::add(A, b));
  67.  
  68. println!("{}", a + B);
  69. println!("{}", a.add(B));
  70. println!("{}", Add::add(a, B));
  71. println!("{}", <&A as ::std::ops::Add<B>>::add(a, B));
  72.  
  73. println!("{}", a + b);
  74. println!("{}", a.add(b));
  75. println!("{}", Add::add(a, b));
  76. println!("{}", <&A as ::std::ops::Add<&B>>::add(a, b));
  77.  
  78. println!("{}", Sneaky + Sneaky);
  79. println!("{}", Sneaky.add(Sneaky));
  80. println!("{}", Add::add(Sneaky, Sneaky));
  81. println!("{}", <Sneaky as ::std::ops::Add<Sneaky>>::add(Sneaky, Sneaky));
  82.  
  83. }
Add Comment
Please, Sign In to add comment