Hay dos tipos de arrays en D: estáticos y dinámicos. Al acceder a arrays
de cualquier tipo en D siempre se comprueban los límites (excepto cuando el
compilador se asegura de que esta comprobación no es necesaria).
Si esta comprobación de límites falla, se lanza una excepción de tipo RangeError
que aborta la ejecución de la aplicación. El programador valiente puede desactivar
esta comprobación de seguridad mediante la opción -boundscheck=off
del compilador
con el fin de mejorar la velocidad de ejecución, pero a costa de la seguridad.
Los arrays estáticos se guardan en la pila (stack en inglés) si se definen dentro de una función, o en la memoria estática en caso contrario. Estos arrays tienen una longitud fija conocida en tiempo de compilación. Un array estático incluye el tamaño:
int[8] arr;
El array arr
es de tipo int[8]
. Como se puede ver, el tamaño del
array se pone al lado del tipo y no después del nombre de la variable como se
hace en C/C++.
Los arrays dinámicos se guardan en el heap y pueden ser extendidos o
encogidos en tiempo de ejecución. Un array dinámico se crea mediante la
expresión new
y su longitud:
int size = 8; // variable en tiempo de ejecución
int[] arr = new int[size];
El tipo de arr
es int[]
. Este tipo de dato también se llama slice.
Los slices son vistas de un bloque continuo de memoria y se verán con
más detalle en la siguiente sección. Arrays multidimensionales
se pueden crear fácilmente mediante la sintaxis auto arr = new int[3][3]
.
Los arrays pueden ser concatenados usando el operador ~
, operación que
creará un nuevo array dinámico.
Se pueden usar operaciones matemáticas sobre los arrays completos usando,
por ejemplo, la sintaxis c[] = a[] + b[]
. Esta operación añade todos los
elementos de a
y b
de la forma c[0] = a[0] + b[0]
, c[1] = a[1] + b[1]
,
etc. Además, también es posible ejecutar operaciones en todo el array con un
valor único:
a[] *= 2; // multiplica todos los elementos por 2
a[] %= 26; // calcula el módulo 26 de todos los elementos de a
Estas operaciones pueden ser optimizadas por el compilador usando instrucciones especiales del procesador realizando dichas operaciones en paralelo.
Tanto los arrays estáticos como dinámicos tienen la propiedad .length
, que
es una propiedad de sólo lectura en los arrays estáticos, pero que puede ser
usada en los arrays dinámicos para cambiar su tamaño de forma dinámica. La
propiedad .dup
crea una copia del array.
Cuando se indexa un array a través de la sintaxis arr[idx]
, se puede usar
el símbolo especial $
, que denota la longitud del array. Por ejemplo,
arr[$ - 1]
referencia el último elemento del array y es una forma rápida
de escribir arr[arr.length - 1]
.
Completa la función encrypt
para cifrar un mensaje secreto. El texto debería
ser encriptado usando el método César (Caesar encryption), que mueve cada
caracter del alfabeto según cierto índice. El texto a ser cifrado sólo contiene
caracteres en el rango a-z
para hacer las cosas más sencillas.
Aquí se puede ver la solución.