Мне нужно создать макроправила, расширяющиеся следующим образом:
define_fn!(fn a());
// expands to
fn a() {}
define_fn!(pub fn a());
// expands to
pub fn a() {}
define_fn!(fn a(arg1: u32,));
// expands to
fn a(arg1: u32) {}
define_fn!(pub fn a(arg1: u32, arg2: i32));
// expands to
pub fn a(arg1: u32, arg2: i32) {}
Я мог бы легко сделать это, используя 4 правила, но я хочу сделать это в 1 правиле, т.е.
macro_rules! define_fn {
(<some magic>) => { <some other magic> };
}
Как это сделать в 1 правиле? Возможно ли это вообще?
В небольшой книге макросов Rust есть страница, на которой показано, как анализировать функцию. После этой страницы это должно делать то, что вы хотите:
macro_rules! define_fn {
($v:vis fn $name:ident ($($i:ident : $t:ty),*)) => {
$v fn $name ($($i: $t),*) {}
};
}
спс за исправление ответа. Я решил проблему с аргументами (я посмотрел определение println!, и по какой-то причине там было 2 правила, и из-за этого меня заблокировали в этой части), но застрял на необязательном pub
. Я не знал, что vis
по умолчанию необязателен
это работает? Я предполагаю, что отсутствующая запятая после макроса в третьем примере не имеет значения.