2016-09-18 13 views
2

有沒有一種方法可以獲得所有導入的模塊或其他方式?據我所見,「allMembers」不會包含導入的成員。獲取所有導入模塊的性狀

我想實現的是從導入的模塊中導入所有成員,但它看起來並不像我想象的那麼容易。如果我指定了導入的完整模塊,我可以很容易地獲得我想要的成員,但是如果我使用當前模塊本身,則不會。

所以我的問題是,有沒有辦法在D中獲取所有導入模塊的名稱,因爲這樣我就可以創建一個在模塊上使用「allMembers」的動態方法。

說明我的意思。

假設我們有模塊a。

module a; 

import b; 
import c; 

... 

foreach (member; __traits(allMembers, a)) { 
    // members of b and c will not come here ... 
} 

即使b和c的輸入是公開的,他們也不會來。

我希望能夠做的是無論如何檢索它們。

+1

'b'和'c'的輸入不會包含在'allMembers'中,而是'b'和'c'本身。如果你可以通過一些'isModule(別名符號)'模板(我不知道該怎麼寫)來過濾成員,你可以在每個模塊上調用'allMembers'來獲得導入的模塊。 – rcorre

+1

[這個優秀的答案](http://stackoverflow.com/a/25560800/1435461)可能會幫助你 – rcorre

+0

在我的情況下,他們不包括在內。我會看到我能想到的,但截至目前,這些解決方案對我沒有任何影響。 @rcorre,已經嘗試過這種解決方案,並沒有改變。我想要避免的是輸入模塊名稱全部手冊,因爲它會是很多模塊,我必須這樣做。雖然 – Bauss

回答

0

如果你導入到一個結構中,那麼allMembers應該工作;例如:

https://dpaste.dzfl.pl/629ff05bdab0

struct Packages { 
    import std_meta = std.meta; 
    import std_range = std.range; 
    import std_range_interfaces = std.range.interfaces; 
    import std_range_primitives = std.range.primitives; 
    import std_traits = std.traits; 
}; 

void main() { 
    foreach (X; __traits(allMembers, Packages)) { 
     pragma(msg, __traits(allMembers, __traits(getMember, Packages, X))); 
    }; 
}; 

...有一些需要注意的,我不記得確切現在。

如果您還希望模塊能夠正常導入,您可以從模塊名稱列表中生成字符串混合。可能有很多方法可以解決這個問題。 (我就不再贅述了,除非有人特別要求它)


我在std-underscore黑客使用這種技術有很大的影響,有一定的幫助,從__traits(compiles__traits(getProtection。所以如果你打算做類似的事情,你可能想檢查一下。

它實際上並沒有你期望的那麼脆弱。我現在在每個項目中都使用std-underscore

+0

但是這需要你仍然手動導入每個包。事情是我有多個嵌套包,因此一個包可能會導入其他包。在這種情況下,這是不夠的,除非它照顧它。我做了什麼來對抗這個,就是廢棄整個軟件包系統,並直接使用模塊,就像包 – Bauss

+0

@Bauss不幸的是,似乎有一些編譯器錯誤阻止了對導入的遞歸內省。例如,請參閱:http://pastebin.com/EiJfnbZv - 當'foo'是一個公開導入其他模塊的模塊時,這兩對'pragma(msg')語句在* *應該*時會打印出不同的結果 – Cauterite

+0

是的,我知道,我知道所有這些解決方法,但它們都不太好,這就是爲什麼我提出這個問題,因爲我想阻止它更糟糕的是,D很棒,所有的東西都可以,但是像這樣的小錯誤無論如何都不值得,因爲它具有所有這些很酷的功能,但它們工作起來並不好,它們只能工作。爲這些事情編寫工具,然後在編譯之前調用它們,但最終還是會有太多的變通方法讓你陷入混亂:你得到了我嗎?比我第一次開始使用時要好得多D幾年前 – Bauss

相關問題