2011-08-30 4 views

答えて

12

私はT.initがあなたが探しているかもしれないと思います。

12

Dの各タイプにはデフォルト値があります。これは、タイプのinitプロパティを介してアクセスします。 int.initfloat.initObject.initなどです。テンプレート型の場合でも、それはまだinitのプロパティです。たとえば、汎用タイプがTの場合は、T.initとなります。

initは、通常、タイプに含まれるエラー値に最も近い値です。整数型の場合は0です。 boolについては、falseです。浮動小数点型の場合は、NaNです。文字の種類は\u00FFです。参照(つまりクラス)とポインタについては、nullです。また、構造体の場合は、そのメンバ変数が直接初期化されている値であれば何でも構いません。例えば

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

S.initの場合a17bfalseSのインスタンスであろう。特に注意すべき点は、initプロパティの必要性は、Dの構造体にデフォルトのコンストラクタを持たせることができない理由です。それらのデフォルト状態、つまり、そのinitプロパティは、コンパイル時には知らなければなりませんが、コンストラクタは実行時に実行されるため、structのデフォルト値はコンストラクタで作成できません。コンストラクタは、デフォルトのコンストラクタを持つことができません。

enumの場合、プロパティは列挙型の種類によって異なります。あなたが本当に新しいタイプを作成していないので、このような

enum i = 7; 

としてマニフェスト定数は、そのタイプ(この場合はint)と同じinit性質を持っているでしょう。ただし、実際に新しいタイプを作成する列挙型の場合(例:

enum E {a = 7、b = 17};

デフォルト値は列挙型の最初の値です。この場合、E.initaとなります。

アレイは少し面白くなっています。動的配列と連想配列の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)'が '3'ではなく' a'を出力するという事実です。 –

関連する問題