没有程序宏,有没有办法在属性中“做宏”?

时间:2019-06-11 14:03:05

标签: rust rust-macros rust-decl-macros

具体来说,我正在尝试将宏输出放入文档注释中。我很兴奋,这正是我想要的:

/// foo
///
#[doc="bar\n\nbaz"]
///
/// quux
struct Dummy;

下一步是用我的内容替换该字符串。根据{{​​3}}的说法,我无法编写#[doc=my_content!()],并且属性宏是过程式的,因此我需要另一个包装箱,而且(我认为)我的内容可以生成而无需任何过程式宏功能。

是否可以通过某种方式对“常规宏”执行此操作,还是我不走运?

1 个答案:

答案 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已经做到了。