Вы можете увидеть расширение макроса, набрав cargo +nightly rustc --profile=check -- -Zunstable-options --pretty=expanded
или используя cargo-expand
fn f1() {
{
::std::io::_print(::std::fmt::Arguments::new_v1(
&["", "\n"],
&match (&(100 / 100),) {
(arg0,) => [::std::fmt::ArgumentV1::new(arg0, ::std::fmt::Debug::fmt)],
},
));
};
();
}
Вы можете увидеть последние ();
, которые должны были быть func_100()
Это потому что нет правила токена в generate_func_call
типа ($number: expr)
, то есть нет правила, соответствующего расширению. Это потому, что $number
не заменяется на 100
, как вы ожидаете от функции. Макрос просто создает больше кода ржавчины на основе типов фрагментов , которые он получает, он не пытается ничего оценить.
Измените код на:
macro_rules! generate_func_call {
($number: expr) => {
match $number {
100 => func_100(),
200 => func_200(),
300 => func_300(),
_ => (),
}
};
}
И, наконец, ();
меняется на:
match 300 {
100 => func_100(),
200 => func_200(),
300 => func_300(),
_ => (),
};