[英]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!()]
,和屬性宏是程序性的,所以我需要另一個箱子對於這一點,再加上(我認為)我的內容可以不需要任何程序上的宏產生特征。
有沒有辦法以某種方式使用“常規宏”來做到這一點,還是我不走運?
編輯:從 1.54.0 開始,屬性可以調用類似函數的宏,啟用問題中提出的代碼。 原答案如下:
答案似乎是否定的。
查看屬性的語法,除了括號、逗號和等號,屬性最終只能包含文字。 所以在這個層面上,Rust 不可能允許更多。
但是,反轉結構可以實現類似的功能,並且doc-comment
crate 會為 doc 注釋執行此操作。 不是從屬性內部調用宏,而是使用宏來創建屬性; 然后,該宏不受限於僅采用文字*。 缺點是,屬性應該應用到的項目必須是宏調用的一部分。 所以這
#[doc=my_content!()]
struct Foo;
變成這樣:
doc_comment!(
my_content!(),
struct Foo;
);
宏的定義很簡單:
#[macro_export]
macro_rules! doc_comment {
($x:expr, $($tt:tt)*) => {
#[doc = $x]
$($tt)*
};
}
(省略了不屬於核心模式的原始宏的一個分支)
(感謝 jonas-schlevink 向我指出這一點)
*除了最后一部分(將宏內容放入屬性中),鏈接問題的答案已經做到了這一點。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.