Sto utilizzando il linguaggio D e desidero ottenere il valore predefinito di un tipo generico, simile al modo in cui default(T)
funziona in C#. È possibile? In caso contrario, quali sono i possibili rimedi?Come ottengo il valore predefinito di un tipo generico?
risposta
Penso che T.init
potrebbe essere quello che stai cercando.
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.
Re enum, secondo codepad.org:
enum Foo {
a = 3,
b = 2,
}
import std.stdio;
void main() { writef("%d", Foo.init); }
dà:
Da notare, tuttavia, il fatto che 'writeln (Foo.init)' stampa 'a' piuttosto che' 3'. –
- 1. Predefinito per tipo generico?
- 2. Come ottengo l'attributo `.class` da un parametro di tipo generico?
- 3. Assegnazione di un valore predefinito ad un generico
- 4. Il parametro di tipo generico predefinito non può essere dedotto
- 5. Come si emetterà il valore predefinito di un tipo?
- 6. Valore predefinito di un tipo in Runtime
- 7. come ottenere il valore predefinito di un tipo se il tipo è noto solo come System.Type?
- 8. Ottieni il tipo di argomento generico e il valore fornito in un metodo generico
- 9. Come convertire il valore di Argomento di tipo generico in un tipo concreto?
- 10. Il confronto di un tipo generico con il suo valore predefinito, senza un vincolo di classe generico, dà un errore di tempo di compilazione
- 11. Valore di campo generico di riflessione generico
- 12. Valore predefinito del tipo dinamico?
- 13. Come ottengo il tipo di una variabile?
- 14. Chiamando il costruttore di un tipo generico
- 15. Attivare un tipo generico?
- 16. Come confrontare il tipo di oggetto con un tipo generico, irrilevante per argomento generico?
- 17. Come abbinare il tipo generico di scala?
- 18. C# valore predefinito di un tipo di puntatore
- 19. Come rendere un metodo generico che prendono un tipo generico
- 20. Come gestire il valore predefinito di ArrayList
- 21. Il valore di default sul predicato generico come argomento
- 22. Forza un parametro di tipo generico come tipo di classe?
- 23. Come ottengo l'url di checkout predefinito per un negozio Magento?
- 24. Come ottengo il valore da un'espressione anonima?
- 25. Trigger SQL: come ottengo il valore aggiornato?
- 26. Recupero del tipo non chiuso di un tipo generico che chiude un tipo generico
- 27. Come ottengo il valore dall'oggetto (stdClass)?
- 28. Come ottengo il valore dall'editor ACE?
- 29. Come si inizializza il valore di un puntatore di tipo * usando la sintassi di Tipo()?
- 30. Come modificare il tipo di dati di una colonna con un valore predefinito
Che dire di enumerazioni? –
Vale la pena notare che 'char.init == '\ xFF''. –
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. –