簡體   English   中英

有沒有辦法在沒有程序宏的情況下在屬性中“執行宏操作”?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM