2016-08-18 72 views
3

使用定義函數的宏時,是否可以向函數添加前綴?如何在宏中添加前綴/後綴標識符?

macro_rules! my_test { 
    ($id:ident, $arg:expr) => { 
     #[test] 
     fn $id() { 
      my_test_impl(stringify!($id), $arg); 
     } 
    } 
} 

例如,fn my_test_$id() {

我使用其可以以數字開始的標識符定義的測試中,我想用一個共同的前綴。

+1

來自@skade_:這是一個跟蹤問題,討論夜間功能'concat_idents',它允許。 https://github.com/rust-lang/rust/issues/29599 – ideasman42

+0

另請參閱http://stackoverflow.com/q/23061702/155423; http://stackoverflow.com/q/24905160/155423; http://stackoverflow.com/q/27415011/155423。 – Shepmaster

回答

5

[...]是否可以爲函數添加前綴?

不,真的沒有。 超級完全沒有絲毫影響。

我想使用一個通用的前綴。

改爲將它們全部放入mod

+1

只是爲了澄清,這是不可能的,因爲[宏衛生](https://doc.rust-lang.org/book/macros.html#hygiene),這是一個功能,因爲它是一個限制。 – allTwentyQuestions

+3

@allTwentyQuestions:其實,這是一個比這更基本的限制。簡短版本:爲了使其工作,您必須能夠在「標識符」位置使用宏。你不能。另一種方法是有某種明確的「令牌串聯」*語法*。沒有。衛生與它沒有任何關係。 –

+0

將它們放入模塊中並不能解決將第一個字符作爲數字的問題。 – ideasman42

-1

目前穩定版不支持此功能。


但是還有一個特點,在夜間叫concat_idents

concat_idents!(my_test_, $id) 

更新:似乎沒有近期計劃將其添加到穩定版本中,請參閱問題。

+0

我沒有提出'concat_idents!'的原因是,正如在該問題中提到的那樣,*無用*。它不能修復;問題在於宏如何工作。 'concat_idents!'沒有多少工作能夠改善這種情況;宏系統將不得不更改爲允許對AST節點進行急切的重新標記,或者編譯器必須進行修改,以允許在任何地方使用宏名稱(這會非常具有破壞性)。所以即使有這個問題有關的問題,它也不會是這個問題。這就是爲什麼我不打擾提及它。 –

+0

即使只是注意到它可能/計劃(但可能不會被支持),仍然值得提出來。 – ideasman42

1

如上所述,您應該使用這個子模塊,但要記住,宏可以創建子模塊,子模塊可以被嵌套,允許他們的名字重疊,子模塊可以提供impl s,並且tests子模塊不是魔術。

我曾經提交過一個pull request,雖然#[no_mangle]出口使它更難,但通過使用這些技巧重構代碼避免了許多「鍋爐板名稱」。