我正在使用D語言,並希望得到一個通用類型的默認值,類似於在C#中工作的方式default(T)
。這可能嗎?如果沒有 - 可能的解決方法是什麼?如何獲得泛型類型的默認值?
回答
我認爲T.init
可能是你要找的。
D中的每個類型都有一個默認值。它通過類型的init
屬性進行訪問。 int.init
,float.init
,Object.init
等。在模板類型的情況下,它仍然是init
屬性。例如,如果您具有通用類型T
,那將是T.init
。
init
通常最接近類型所具有的錯誤值。對於整數類型,它是0
。對於bool
,它是false
。對於浮點類型,它是NaN
。對於字符類型,它是\u00FF
。對於參考(即類)和指針,它是null
。而在結構體的情況下,無論其成員變量直接初始化的值如何。例如在
struct S
{
int a = 17;
bool b;
}
S.init
的情況下將是S
其a
是17
和b
是false
一個實例。特別值得注意的是,對屬性init
的需求是D中的結構不能具有默認構造函數的原因。它們的默認狀態 - 也就是它們的init
屬性 - 必須在編譯時已知,而構造函數會在運行時運行,所以結構體的默認值不能用構造函數創建,因此,儘管結構體可以有構造函數,他們不能有默認的構造函數。
在枚舉的情況下,init
屬性取決於它的枚舉類型。艙單常數如
enum i = 7;
將有相同init
屬性作爲其(在這種情況下int
)類型的,因爲你並沒有真正創建一個新的類型。但是,對於實際創建新類型的枚舉,例如
枚舉E {a = 7,b = 17};
默認值是枚舉中的第一個值。在這種情況下,E.init
將是a
。
雖然數組有點有趣。動態數組和關聯數組的init
屬性爲null
。但是,當爲數組分配內存(無論是靜態還是動態)時,每個元素都將初始化爲其類型的init
屬性。因此,對於數組,您同時具有它們的init
值和它們的元素值init
。
在任何情況下,獲取某種類型默認值的通用方法是T.init
,其中T
是您希望的默認值的類型 - 無論是特定類型還是模板參數。
重新枚舉,根據codepad.org:
enum Foo {
a = 3,
b = 2,
}
import std.stdio;
void main() { writef("%d", Foo.init); }
給出:
然而,值得注意的是'writeln(Foo.init)'會打印'a'而不是'3'。 –
- 1. 如何獲得泛型類
- 2. 如何以非泛型方式獲取某個類型的默認值?
- 3. Java:獲得泛型類型
- 4. 如何獲得泛型類的類?
- 5. Java泛型:如何從一個方法獲得泛型類型?
- 6. 獲得泛型類型的泛型類型
- 7. 如何獲得Scala中某個類型的默認值?
- 8. 獲得「真實」類的泛型類型
- 9. 如何獲得泛型類型的實際類型?
- 10. 如何獲得泛型類型的類型參數?
- 11. 如何獲得泛型類之外的實際泛型參數?
- 12. 如何從對象類型獲得泛型類型
- 13. Java的泛型獲得類型參數
- 14. 如何爲泛型提供默認類型?
- 15. Java泛型 - 獲得類?
- 16. 如何獲得泛型類的「真實」類型?
- 17. 如何獲得內部類型泛型類的
- 18. 如何使用泛型類型的泛型列表泛型類
- 19. 如何獲得具有多個類型參數的泛型類的類型? - C#
- 20. 如何獲得泛型類型類在Java中
- 21. 如何在泛型方法中獲得泛型類的類實例
- 22. JPA默認獲取類型
- 23. 如何從堆棧中獲得泛型參數的類型?
- 24. 獲取泛型類類型
- 25. 如何獲取Java中某個類型的默認值?
- 26. 如何在運行時獲得泛型類型?
- 27. 如何在沒有泛型的基類中獲得派生類的類型?
- 28. 如何在Java中獲取類型變量的類型泛型
- 29. 如何獲得Scheme中的值類型?
- 30. 默認泛型類型參數不能推斷
什麼枚舉? –
值得注意的是'char.init =='\ xFF''。 –
我想我會錯過一些類型,但我想不出什麼時候寫了我的初始答案。希望他們現在都在。 –