Макрос для создания нескольких реализаций структур и трейтов из параметров

Я пытаюсь создать макрос, используя macro_rules!, который будет генерировать серию struct вместе с реализациями для данной черты.

Пример того, что я пробовал:

#[macro_export]
macro_rules! a_tree {
    ($name: literal, $fruit: literal) => {
        pub struct $name;
        impl FruitTree for $name {
            fn expected_fruit() -> f64 {
                println!("the {} tree should produce {} fruit", $name, $fruit);
                20 * $fruit
            }
        }
    };
}

pub trait FruitTree {
    fn expected_fruit() -> f64;
}

a_tree![Apple, 1];
a_tree![Cherry, 20];
a_tree![Plum, 10];
a_tree![Orange, 1.2];

Ссылка на игровую площадку Rust

Я не уверен, что это можно сделать. Мне не обязательно нужна ссылка println! на $name, если это type вместо literal. Но у меня тоже так не получалось.

То, что я хотел бы получить в качестве вывода для каждой структуры, будет выглядеть следующим образом:

pub struct Apple;

impl FruitTree for Apple {
     fn expected_fruit() -> f64 {
         println!("the {} tree should produce fruit with a ratio of {}", "Apple", 1);
         20 * 1
     }
}

В качестве альтернативы я мог бы заранее объявить все структуры и заставить макрос генерировать только реализации трейтов, но я бы сделал это только в крайнем случае.

Благодарю вас!

Почему Python в конце концов умрет
Почему Python в конце концов умрет
Последние 20 лет были действительно хорошими для Python. Он прошел путь от "просто языка сценариев" до основного языка, используемого для написания...
0
0
21
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Я понял это.

Детская площадка ржавчины

Потребовалось несколько изменений:

  • используется ident вместо ty или literal вместо $name
  • добавлен [derive(Debug)] в сгенерированную структуру, чтобы разрешить печать
  • исправлены некоторые f64 конверсии
  • добавлен пример использования в main()

Благодарю вас!

Другие вопросы по теме