Estoy usando el lenguaje D y me gustaría obtener el valor predeterminado de un tipo genérico, similar al modo en que default(T)
funciona en C#. es posible? Si no, ¿cuáles son las posibles soluciones?¿Cómo obtengo el valor predeterminado de un tipo genérico?
Respuesta
Creo que T.init
podría ser lo que estás buscando.
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.
Re enumeración, de acuerdo con codepad.org:
enum Foo {
a = 3,
b = 2,
}
import std.stdio;
void main() { writef("%d", Foo.init); }
da:
De nota, sin embargo, es el hecho de que 'writeln (Foo.init)' imprimirá 'a' en lugar de' 3'. –
- 1. valor genérico predeterminado
- 2. ¿Predeterminado para el tipo genérico?
- 3. Asignar un valor predeterminado a un genérico
- 4. ¿Cómo obtengo el nombre de tipo de un argumento de tipo genérico?
- 5. Dado un tipo ExpressionType.MemberAccess, ¿cómo obtengo el valor del campo?
- 6. cómo obtener el valor predeterminado de un tipo si el tipo solo se conoce como Tipo de sistema?
- 7. valor predeterminado Tipo de recopilación
- 8. ¿Cómo convertir el valor del argumento de tipo genérico a un tipo concreto?
- 9. valor predeterminado en el predicado genérico como argumento
- 10. Especifique el valor predeterminado para un tipo de referencia
- 11. ¿Cómo obtengo el tipo de valor en Scheme?
- 12. ¿Cómo obtener el tipo real de un tipo genérico?
- 13. ¿Cómo comparar el tipo de objeto con un tipo genérico, irrelevante para el argumento genérico?
- 14. ¿Cómo obtengo el valor predeterminado para un campo en un modelo de Django?
- 15. ¿Cómo puedo llamar al valor predeterminado (T) con un tipo?
- 16. ¿Por qué obtengo "Tipo genérico ilegal para instanceof"?
- 17. ¿Por qué obtengo el "error: ... debe ser un tipo de referencia" en mi método genérico C#?
- 18. ¿Cómo obtengo un valor de registro en Inno Setup cuando el valor solo usa el nombre predeterminado?
- 19. F #: ¿Cómo coincido un patrón con un valor de tipo?
- 20. ¿Cómo puedo obtener el valor predeterminado para un tipo en Scala?
- 21. llamar al constructor de un tipo genérico
- 22. ¿Cómo puedo instanciar un tipo genérico en Java?
- 23. ¿Cómo puedo probar una variable de tipo genérico para igualdad con Predeterminado (T) en Delphi?
- 24. Java: cómo devolver el tipo genérico
- 25. ¿Cómo obtengo el valor de MemberInfo?
- 26. ¿Cómo obtengo el valor de object (stdClass)?
- 27. ¿Cómo obtengo el tipo de variable?
- 28. Cómo modificar el tipo de datos de una columna con un valor predeterminado
- 29. ¿Cómo establecer el valor predeterminado para un parámetro de función de tipo TEncoding?
- 30. C#: ¿Cómo encontrar el valor predeterminado para un Tipo de tiempo de ejecución?
¿Qué pasa con las enumeraciones? –
Vale la pena señalar que 'char.init == '\ xFF''. –
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. –