D es un lenguaje de tipado estático: una vez que una variable ha sido declarada, su tipo no se puede cambiar desde ese momento en adelante. Esto permite al compilador evitar errores de forma temprana e imponer restricciones en tiempo de compilación. Una buena seguridad en los tipos de datos proporciona el apoyo que se necesita para crear grandes programas más seguros y más mantenibles.
Hay varios elementos para calificar los de tipos de datos en D, pero los más
comunes son const
e inmmutable
.
immutable
Junto con el sistema de tipado estático, D proporciona calificadores de tipos
(type qualifiers en inglés), a veces llamados constructores de tipos, que
obligan a cumplir restricciones en ciertos objectos. Por ejemplo, un objeto
immutable
puede ser inicializado sólo una vez y, después de esta inicialización,
ya no puede ser modificado.
immutable int err = 5;
// o: immutable err = 5 y su tipo, int, se infiere.
err = 5; // no compila
Los objetos marcados con immutable
pueden así ser puestos de forma segura en
memoria compartida entre varios hilos sin necesidad de sincronización ya que
estos nunca van a cambiar por definición. Esto también implica que los objetos
marcados con immutable
pueden ser puestos perfectamente en memorias caché.
const
Los objetos marcados con const
tampoco pueden ser modificados. Pero esta
restricción sólo se aplica al entorno actual. Un puntero marcado con const
puede ser creado tanto desde un objeto mutable como de uno immutable
.
Esto significa que el objeto es const
en el ámbito actual, pero alguien
podría modificarlo desde un contexto diferente. Es común que las API acepten
argumentos marcados con const
para asegurarse que no se modifican dentro de
la función, pero dicha función puede aceptar argumentos tanto de objetos
mutables como immutable
s.
void foo(const char[] s) {
// si la siguiente línea no estuviera comentada, la
// compilación daría un error (no se puede modificar const):
// s[0] = 'x';
import std.stdio : writeln;
writeln(s);
}
// gracias a `const`, ambas llamadas compilan:
foo("abcd"); // string (cadena de caracteres) es un array inmutable
foo("abcd".dup); // .dup devuelve una copia mutable
Tanto immutable
como const
son calificadores transitivos, es decir, cuando
const
se aplica a un tipo de datos, este se aplica recursivamente a cada
subcomponente de dicho tipo.