具体来说,我正在尝试将宏输出放入文档注释中。我很兴奋,这正是我想要的:
/// foo
///
#[doc="bar\n\nbaz"]
///
/// quux
struct Dummy;
下一步是用我的内容替换该字符串。根据{{3}}的说法,我无法编写#[doc=my_content!()]
,并且属性宏是过程式的,因此我需要另一个包装箱,而且(我认为)我的内容可以生成而无需任何过程式宏功能。
是否可以通过某种方式对“常规宏”执行此操作,还是我不走运?
答案 0 :(得分:0)
答案似乎没有。
看着grammar for attributes,除了括号,逗号和等号外,属性最终只能包含文字。因此,在此级别上,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)*
};
}
(省略了the original macro的分支,该分支不属于核心模式)
(感谢jonas-schlevink为pointing我提供了此服务)
*除了最后一部分(将宏内容添加到属性中)之外,linked question's answer已经做到了。