2011-08-30 76 views

回答

12

我認爲T.init可能是你要找的。

12

D中的每個類型都有一個默認值。它通過類型的init屬性進行訪問。 int.init,float.initObject.init等。在模板類型的情況下,它仍然是init屬性。例如,如果您具有通用類型T,那將是T.init

init通常最接近類型所具有的錯誤值。對於整數類型,它是0。對於bool,它是false。對於浮點類型,它是NaN。對於字符類型,它是\u00FF。對於參考(即類)和指針,它是null。而在結構體的情況下,無論其成員變量直接初始化的值如何。例如在

struct S 
{ 
    int a = 17; 
    bool b; 
} 

S.init的情況下將是Sa17bfalse一個實例。特別值得注意的是,對屬性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是您希望的默認值的類型 - 無論是特定類型還是模板參數。

+0

什麼枚舉? –

+0

值得注意的是'char.init =='\ xFF''。 –

+0

我想我會錯過一些類型,但我想不出什麼時候寫了我的初始答案。希望他們現在都在。 –

1

重新枚舉,根據codepad.org

enum Foo { 
    a = 3, 
    b = 2, 
} 

import std.stdio; 
void main() { writef("%d", Foo.init); } 

給出:

+1

然而,值得注意的是'writeln(Foo.init)'會打印'a'而不是'3'。 –