2016-11-08 18 views
2

我有一個文件,其中包含Rust項目的共享宏。在Rust中使用`macro_use`時如何將一些宏定義爲'private'給模塊?

因爲我想重新使用宏跨箱(模塊間),我宣佈模塊#[macro_use]

在寫宏,我拆出一些共享邏輯成宏爲了避免重複,在這種情況下我不能使用一個私有函數,它需要的宏。 如果可能的話,我想隱藏這個共享宏,這樣它就不能被其他模塊直接使用。

有沒有辦法讓一些宏私人,所以他們不通過#[macro_use]暴露於同一箱子中的其他模塊?

回答

0

目前,宏命名空間界限只能跨包裝箱進行約束。

使某些宏變爲私有的唯一方法是將該模塊拆分成一個包,然後使用#[macro_export]來定義從該包中導出哪些宏。

請參閱Rust's documentation on this topic


注:有可能會做一些這方面的模糊的方式,但是從閱讀文檔,似乎這個功能不是官方支持,這就是爲什麼我張貼了這個答案 - 高興被證明是錯誤的!

#rust IRC通道聲明這是Macros 2.0中可能支持的內容。

3

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); 
    } 
} 

這種方式,沒有實現宏觀下去;而你只有一個宏來導出。

+0

該示例顯示了一個實現和使用。這怎麼能在多個宏之間共享? – ideasman42

+0

@ ideasman42:沒有什麼能夠阻止你從另一個宏調用'hello_world!(impl ...)'。它並沒有被隱藏得那麼嚴重。 –

相關問題