Guest User

Untitled

a guest
Jun 20th, 2018
59
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.03 KB | None | 0 0
  1. macro_rules! destructure_fields{
  2. ($matched:expr; $($variant:path),+ => $value:ident) => (
  3. match $matched {
  4. $($variant($value))|+ => $value
  5. }
  6. );
  7. //Problematic macro
  8. ($matched:expr; $($variant:path),+ => $($values:ident),+) => (
  9. match $matched {
  10. destructure_fields!(@create_pattern $($variant),+ => ($($values),+)) => ($($values),+)
  11. }
  12. );
  13. (@create_variant $variant:path, ($($values:expr),+)) => {
  14. $variant($($values),+)
  15. };
  16. (@create_pattern $($variant:path),+ => $value_tuple:tt) => (
  17. $(destructure_fields!(@create_variant $variant, $value_tuple))|+
  18. );
  19. }
  20.  
  21. enum Test<'a> {
  22. A(&'a str, usize),
  23. B(&'a str, usize),
  24. C(&'a str, usize),
  25. D(&'a str, usize)
  26. }
  27.  
  28. impl<'a> Test<'a> {
  29. fn get_content(&self) -> (&str, usize) {
  30. destructure_fields!(self; Test::A, Test::B, Test::C, Test::D => string, number)
  31. }
  32. }
  33.  
  34. fn main() {
  35. let (string, number) = Test::B("This is a test!", 5).get_content();
  36. println!("{}{}", string, number);
  37. }
Add Comment
Please, Sign In to add comment