Я пытаюсь создать макрос, используя 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
}
}
В качестве альтернативы я мог бы заранее объявить все структуры и заставить макрос генерировать только реализации трейтов, но я бы сделал это только в крайнем случае.
Благодарю вас!
Я понял это.
Потребовалось несколько изменений:
ident
вместо ty
или literal
вместо $name
[derive(Debug)]
в сгенерированную структуру, чтобы разрешить печатьf64
конверсииmain()
Благодарю вас!