有没有办法在没有程序宏的情况下在属性中 "do macro stuff" ?
Is there a way to "do macro stuff" in an attribute without a procedural macro?
具体来说,我正在尝试将宏输出放入文档注释中。我很兴奋这正是我想要的:
/// foo
///
#[doc="bar\n\nbaz"]
///
/// quux
struct Dummy;
下一步是用我的内容替换该字符串。根据 ,我不会写 #[doc=my_content!()]
,属性宏是过程性的,所以我需要另一个箱子,另外(我认为)我的内容可以在不需要任何过程性宏的情况下生成功能。
有没有办法以某种方式用 "conventional macros" 做到这一点,还是我运气不好?
编辑:从 1.54.0 开始,Attributes can invoke function-like macros,启用问题中提出的代码。原答案如下:
答案似乎是否定的
再看grammar for attributes,除了括号、逗号和等号,属性最终只能包含文字。所以在这个层面上,Rust 不可能允许更多。
但是,反转结构可以实现类似的功能,doc-comment
crate 可以为文档注释执行此操作。不要从属性内部调用宏,而是使用宏来创建属性;然后该宏不限于仅采用文字*。缺点是,属性应该应用的项目必须是宏调用的一部分。所以这个
#[doc=my_content!()]
struct Foo;
变成这样:
doc_comment!(
my_content!(),
struct Foo;
);
宏的定义是straight-forward:
#[macro_export]
macro_rules! doc_comment {
($x:expr, $($tt:tt)*) => {
#[doc = $x]
$($tt)*
};
}
(省略了 the original macro 的一个不属于核心模式的分支)
(感谢 jonas-schlevink 为 pointing 我提供了这个)
*除了最后一部分(将宏内容放入属性中), 已经做到了。
具体来说,我正在尝试将宏输出放入文档注释中。我很兴奋这正是我想要的:
/// foo
///
#[doc="bar\n\nbaz"]
///
/// quux
struct Dummy;
下一步是用我的内容替换该字符串。根据 #[doc=my_content!()]
,属性宏是过程性的,所以我需要另一个箱子,另外(我认为)我的内容可以在不需要任何过程性宏的情况下生成功能。
有没有办法以某种方式用 "conventional macros" 做到这一点,还是我运气不好?
编辑:从 1.54.0 开始,Attributes can invoke function-like macros,启用问题中提出的代码。原答案如下:
答案似乎是否定的
再看grammar for attributes,除了括号、逗号和等号,属性最终只能包含文字。所以在这个层面上,Rust 不可能允许更多。
但是,反转结构可以实现类似的功能,doc-comment
crate 可以为文档注释执行此操作。不要从属性内部调用宏,而是使用宏来创建属性;然后该宏不限于仅采用文字*。缺点是,属性应该应用的项目必须是宏调用的一部分。所以这个
#[doc=my_content!()]
struct Foo;
变成这样:
doc_comment!(
my_content!(),
struct Foo;
);
宏的定义是straight-forward:
#[macro_export]
macro_rules! doc_comment {
($x:expr, $($tt:tt)*) => {
#[doc = $x]
$($tt)*
};
}
(省略了 the original macro 的一个不属于核心模式的分支)
(感谢 jonas-schlevink 为 pointing 我提供了这个)
*除了最后一部分(将宏内容放入属性中),