std.conv.to!string(enum.member)
如何工作?函數如何獲取枚舉成員並返回其名稱?它使用編譯器擴展或類似的東西嗎?自從我來自C/C++世界以來,這對我來說有點通常。string(enum.member)是如何工作的?
回答
它所做的是對enum類型使用編譯時反射來獲取成員列表(名稱作爲字符串)及其值。它從這些信息中構造一個switch語句,以便快速查找從值中獲取名稱。 to!SomeEnum("a_string")
使用相同的原則,只是在另一個方向。
使用__traits(allMembers, TheEnumType)
訪問編譯時反射信息,該信息返回可以循環以構建switch語句的字符串列表。然後__traits(getMember, TheEnumType, memberName)
被用來獲取身體。
性狀可以看到更多的在這裏:http://dlang.org/traits.html#allMembers
這allMembers
一個適用於多種類型,如在例子中不只是班級,而且結構,枚舉,等等,甚至模塊。
火衛一的源代碼有一個像EnumMembers
在std.traits
一些例子:https://github.com/D-Programming-Language/phobos/blob/master/std/traits.d#L3360
雖然火衛一源是有點兒難懂,但線3399,在該函數的底部,則可以使用__traits(allMembers)
照見其數據源。根據許多std.traits
函數實現了std.conv.to
。
您還可以檢查出樣章選項卡以獲取反射章我的d食譜這也討論了這個東西:
http://www.packtpub.com/discover-advantages-of-programming-in-d-cookbook/book
在該章的最後一個例子說明如何使用幾個基於字符串構建一個小函數調度程序的反射功能。下面的章節(不是免費提供)顯示瞭如何從中創建一個轉換器以提高效率。這實際上很簡單:只要將case
語句放在編譯時數據的foreach
內,D編譯器就會展開,然後爲您優化查找表!
- 1. java.awt.Color.getColor(String colorName)是如何工作的?
- 2. HttpUitlity.UrlDecode(string)是如何工作的?
- 3. Applescript`string id`如何工作?
- 4. String Literal Pool如何工作
- 5. std :: string length()函數是如何工作的?
- 6. 語法MODULE :: METHODNAME('string')是如何工作的
- 7. 「string :: erase」如何在cpp中工作?
- 8. Java String和StringBuffer如何工作
- 9. IDataErrorInfo.this [string propertyName]如何在C#中工作?
- 10. AsyncTask <String,Void,Void>如何工作?
- 11. std :: string ==不工作?
- 12. String []和String ...(Var-args)在內部工作時是否相同?
- 13. .Replace(String,String)VB函數不工作
- 14. 工作目錄是如何工作的?
- 15. AngularJS是如何工作的?
- 16. ConstantTimeByteEq是如何工作的?
- 17. $(this.hash)是如何工作的?
- 18. 這是如何工作的?
- 19. ClientIDMode是如何工作的?
- 20. 這是如何工作的?
- 21. NSCountedSet是如何工作的?
- 22. 這是如何工作的?
- 23. EngineYard是如何工作的
- 24. OpenID是如何工作的?
- 25. Html.fromHtml是如何工作的?
- 26. weak_ptr是如何工作的?
- 27. CGContextTransalateCTM是如何工作的?
- 28. Boost.Python是如何工作的?
- 29. NSCondition是如何工作的?
- 30. loop.parent是如何工作的?