2011-08-30 14 views

Respuesta

12

Creo que T.init podría ser lo que estás buscando.

12

Cada tipo en D tiene un valor predeterminado. Se accede a través de la propiedad init del tipo. int.init, float.init, Object.init, etc. En el caso de un tipo de plantilla, sigue siendo la propiedad init. Por ejemplo, si tuviera el tipo genérico T, sería T.init.

init es generalmente lo más cercano a un valor de error que tiene el tipo. Para tipos integrales, es 0. Para bool, es false. Para tipos de coma flotante, es NaN. Para los tipos de caracteres, es \u00FF. Para referencias (es decir, clases) y punteros, es null. Y en el caso de las estructuras, es cualquiera sea el valor al que se inicialicen directamente sus variables miembro. p.ej. En el caso de

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

S.init sería una instancia de S cuya a era 17 y b era false. De particular interés, la necesidad de la propiedad init es la razón por la que las estructuras en D no pueden tener constructores predeterminados. Su estado predeterminado - es decir, su propiedad init - debe conocerse en tiempo de compilación, mientras que un constructor se ejecutará en tiempo de ejecución, por lo que el valor predeterminado de una estructura no se puede crear con un constructor, y así, mientras que las estructuras pueden tener constructores, no pueden tener constructores por defecto.

En el caso de enums, la propiedad init depende del tipo de enumeración que sea. Una constante manifiesta como

enum i = 7; 

tendría el mismo init propiedad como su tipo (int en este caso), ya que en realidad no crea un nuevo tipo. Sin embargo, para las enumeraciones que realmente crean un nuevo tipo, p.

enumeración E {a = 7, b = 17};

el valor predeterminado es el primer valor en la enumeración. En este caso, E.init sería a.

Sin embargo, las matrices son un poco interesantes. La propiedad init para matrices dinámicas y matrices asociativas es null. Sin embargo, cuando asigna memoria para una matriz (ya sea estática o dinámica), cada elemento se inicializa a la propiedad init de su tipo. Por lo tanto, con las matrices, tiene tanto la cuestión de su valor init como el valor init de sus elementos.

En cualquier caso, la forma genérica para obtener el valor predeterminado de un tipo es T.init, donde T es el tipo que desea el valor predeterminado de, ya sea un tipo específico o un parámetro de plantilla.

+0

¿Qué pasa con las enumeraciones? –

+0

Vale la pena señalar que 'char.init == '\ xFF''. –

+0

Pensé que echaría de menos algunos tipos, pero no podía pensar en qué cuando escribí mi respuesta inicial. Con suerte, todos están en su ahora. –

1

Re enumeración, de acuerdo con codepad.org:

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

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

da:

+1

De nota, sin embargo, es el hecho de que 'writeln (Foo.init)' imprimirá 'a' en lugar de' 3'. –

Cuestiones relacionadas