Сгенерировать значение атрибута с помощью макроса
Предположим, у меня есть ident
входной параметр с именем module_name
. Как я могу сгенерировать значение атрибута с помощью этого параметра?
Проще говоря, я хочу сгенерировать что-то вроде этого:
macro_rules! import_mod {
( $module_name:ident ) => {
// This does not work,
// but I want to generate the value of the feature attribute.
// #[cfg(feature = $module_name)]
pub mod $module_name;
}
}
import_mod!(module1);
// #[cfg(feature = "module1")]
// pub mod module1;
1 ответ
Решение
Аргумент в директиве компилятора должен быть буквальным.
Половина приличного обходного пути состоит в том, чтобы воспринимать буквально, а также вашу "особенность":
macro_rules! my_import {
( $module_name:ident, $feature_name:literal ) => {
#[cfg(feature = $feature_name)]
mod $module_name;
}
}
my_import!(foo, "foo");
Для справки - https://doc.rust-lang.org/stable/reference/attributes.html
Подводя итог: большинство встроенных атрибутов имеют правило #[<attribute> = <literal>]