我有一個文件,其中包含Rust項目的共享宏。在Rust中使用`macro_use`時如何將一些宏定義爲'private'給模塊?
因爲我想重新使用宏跨箱(模塊間),我宣佈模塊#[macro_use]
。
在寫宏,我拆出一些共享邏輯成宏爲了避免重複,在這種情況下我不能使用一個私有函數,它需要的宏。 如果可能的話,我想隱藏這個共享宏,這樣它就不能被其他模塊直接使用。
有沒有辦法讓一些宏私人,所以他們不通過#[macro_use]
暴露於同一箱子中的其他模塊?
我有一個文件,其中包含Rust項目的共享宏。在Rust中使用`macro_use`時如何將一些宏定義爲'private'給模塊?
因爲我想重新使用宏跨箱(模塊間),我宣佈模塊#[macro_use]
。
在寫宏,我拆出一些共享邏輯成宏爲了避免重複,在這種情況下我不能使用一個私有函數,它需要的宏。 如果可能的話,我想隱藏這個共享宏,這樣它就不能被其他模塊直接使用。
有沒有辦法讓一些宏私人,所以他們不通過#[macro_use]
暴露於同一箱子中的其他模塊?
目前,宏命名空間界限只能跨包裝箱進行約束。
使某些宏變爲私有的唯一方法是將該模塊拆分成一個包,然後使用#[macro_export]
來定義從該包中導出哪些宏。
請參閱Rust's documentation on this topic。
注:有可能會做一些這方面的模糊的方式,但是從閱讀文檔,似乎這個功能不是官方支持,這就是爲什麼我張貼了這個答案 - 高興被證明是錯誤的!
#rust IRC通道聲明這是Macros 2.0中可能支持的內容。
Rust中實際上有一個習慣用法,用於隱藏「實現細節」宏。
而不是宣佈一個單獨的宏,可以改爲聲明現有的宏中的一個單獨情況。我見過的示例將使用impl
關鍵字,而impl
則位於宏定義的底部。
因此,:
macro_rules! hello_impl {
($name:expr) => {
println!("Hello {}!", $name);
}
}
macro_rules! hello_world {
() => {
hello_impl!("world");
}
}
您使用:
macro_rules! hello_world {
() => {
hello_world!(impl "world");
},
(impl $name:expr) => {
println!("Hello {}!", $name);
}
}
這種方式,沒有實現宏觀下去;而你只有一個宏來導出。
該示例顯示了一個實現和使用。這怎麼能在多個宏之間共享? – ideasman42
@ ideasman42:沒有什麼能夠阻止你從另一個宏調用'hello_world!(impl ...)'。它並沒有被隱藏得那麼嚴重。 –