Ответ, кажется, нет.
Глядя на грамматику для атрибутов , кроме скобок, запятых и знаков равенства, атрибуты могут в конечном итоге содержать только литералы. Таким образом, на этом уровне Rust не позволяет больше.
Однако, инвертирование структуры делает что-то подобное, и клеть doc-comment
делает это для комментариев в документации. Вместо вызова макроса из атрибута используйте макрос для создания атрибута; этот макрос не ограничивается только получением литералов *. Недостатком является то, что элемент, к которому должен применяться атрибут, должен быть частью вызова макроса. Так что это
#[doc=my_content!()]
struct Foo;
становится таким:
doc_comment!(
my_content!(),
struct Foo;
);
Определение макроса простое:
#[macro_export]
macro_rules! doc_comment {
($x:expr, $($tt:tt)*) => {
#[doc = $x]
$($tt)*
};
}
(опущена ветвь исходного макроса , который не является частью шаблона ядра)
(спасибо Йонасу-Шлевинку за указание мне на это)
* за исключением этой последней части (получение макрокоманды в атрибут), ответ на связанный вопрос *1030* уже делает именно это.