2011-08-30 18 views

Odpowiedz

12

Myślę, że T.init może być tym, czego szukasz.

12

Każdy typ D ma wartość domyślną. Dostęp do niego można uzyskać za pośrednictwem właściwości typu: init. int.init, float.init, Object.init itp. W przypadku typu szablonowego nadal jest to właściwość init. Na przykład, jeśli masz typowy typ T, będzie to T.init.

init jest najczęściej najbliższy wartości błędu, jaką ma typ. W przypadku typów integralnych jest to 0. Dla bool jest to false. W przypadku typów zmiennoprzecinkowych jest to NaN. W przypadku typów znaków jest to \u00FF. W przypadku odniesień (to znaczy klas) i wskaźników, jest to null. W przypadku structs jest to wartość, do której są bezpośrednio zainicjowane jego zmienne składowe. na przykład W przypadku

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

S.init będzie wystąpienie S którego a był 17 i b był false. Na szczególną uwagę zasługuje fakt, że właściwość init jest powodem, że struktury w D nie mogą mieć domyślnych konstruktorów. Ich domyślny stan - czyli ich własność init - musi być znany w czasie kompilacji, podczas gdy konstruktor byłby uruchamiany w środowisku wykonawczym, więc domyślna wartość struct nie może zostać utworzona za pomocą konstruktora, a więc, gdy struktura może mieć konstruktory, nie mogą mieć domyślnych konstruktorów.

W przypadku wyliczenia właściwość init zależy od rodzaju wyliczenia, jakie to jest. Manifest stałe takie jak

enum i = 7; 

miałby taką samą init nieruchomości jako swojego rodzaju (int w tym przypadku), ponieważ tak naprawdę nie tworzyć nowego typu. Jednak w przypadku wyliczeń, które faktycznie tworzą nowy typ, np.

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

domyślną wartością jest pierwsza wartość w wyliczeniu. W tym przypadku E.init będzie a.

Tablice są tam, gdzie robi się trochę interesująco. Właściwość init dla tablic dynamicznych i tablic asocjacyjnych to null. Jednak przy przydzielaniu pamięci dla tablicy (czy to statycznej czy dynamicznej), każdy element jest inicjowany na jego właściwość typu: init. Tak więc z tablicami macie zarówno wartość ich wartości init, jak i wartość ich elementów w postaci init.

W każdym przypadku ogólny sposób uzyskania wartości domyślnej typu to T.init, gdzie T jest typem, który ma być domyślną wartością - czy jest to określony typ czy parametr szablonu.

+0

Co o teksty stałe? –

+0

Warto zauważyć, że 'char.init == '\ xFF''. –

+0

Uznałem, że będę tęsknił za niektórymi typami, ale nie mogłem wymyślić, kiedy napisałem swoją pierwszą odpowiedź. Mam nadzieję, że wszyscy są teraz w swoim. –

1

Re wyliczenia, według codepad.org:

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

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

daje:

+1

Na uwagę zasługuje jednak fakt, że 'writeln (Foo.init)' wypisuje 'a' zamiast' 3'. –

Powiązane problemy