2011-08-30 11 views

risposta

12

Penso che T.init potrebbe essere quello che stai cercando.

12

Ogni tipo in D ha un valore predefinito. È accessibile tramite la proprietà init del tipo. int.init, float.init, Object.init, ecc. Nel caso di un tipo di modello, è ancora la proprietà init. Ad esempio, se avevi il tipo generico T, sarebbe T.init.

init è generalmente il più vicino a un valore di errore del tipo. Per i tipi interi, è 0. Per bool, è false. Per i tipi a virgola mobile, è NaN. Per i tipi di caratteri, è \u00FF. Per i riferimenti (ad esempio le classi) e i puntatori, è null. E nel caso delle strutture, è qualunque sia il valore a cui sono direttamente inizializzate le sue variabili membro. per esempio. Nel caso di

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

S.init sarebbe un'istanza di S cui a era 17 e b era false. In particolare, la necessità della proprietà init è la ragione per cui le strutture in D non possono avere costruttori predefiniti. Lo stato predefinito, ovvero la proprietà init, deve essere noto al momento della compilazione, mentre un costruttore viene eseguito in fase di runtime, quindi il valore predefinito di una struct non può essere creato con un costruttore e così, mentre le strutture possono avere costruttori, non possono avere costruttori predefiniti.

In caso di enumerazione, la proprietà init dipende dal tipo di enumerazione che è. Una costante manifesta come

enum i = 7; 

avrebbe lo stesso init proprietà come il tipo (int in questo caso), dal momento che in realtà non crea un nuovo tipo. Tuttavia, per le enumerazioni che in realtà creano un nuovo tipo, ad es.

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

il valore predefinito è il primo valore nell'enumerazione. In questo caso, E.init sarebbe a.

Gli array sono comunque interessanti. La proprietà init per gli array dinamici e gli array associativi è null. Tuttavia, quando si assegna memoria per un array (sia esso statico o dinamico), ciascun elemento viene inizializzato sulla proprietà init del tipo. Quindi, con gli array, hai sia la questione del loro valore init e il valore init dei loro elementi.

In ogni caso, il modo generico per ottenere il valore di default di un tipo è T.init dove T è il tipo che si desidera che il valore di default - che si tratti di un tipo specifico o di un parametro di modello.

+0

Che dire di enumerazioni? –

+0

Vale la pena notare che 'char.init == '\ xFF''. –

+0

Ho pensato che mi sarei perso alcuni tipi, ma non riuscivo a pensare a cosa quando ho scritto la mia risposta iniziale. Speriamo che siano tutti nella loro ora. –

1

Re enum, secondo codepad.org:

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

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

dà:

+1

Da notare, tuttavia, il fatto che 'writeln (Foo.init)' stampa 'a' piuttosto che' 3'. –

Problemi correlati