В D есть два типа массивов: статические и динамические.
При доступе к любому типу массива всегда проверяется выход за его границы, и если это случится, выполнение приложения прервётся с сообщением об ошибке
RangeError. Смельчаки могут запретить такие проверки с помощью флага
компилятора -boundschecks=off, чтобы выжать побольше производительности из двоичных файлов.
Статические массивы хранятся на стеке, если определены внутри функции, и в статической памяти в других случаях. Они имеют фиксированную длину, известную ещё на этапе компиляции. Тип статического массива содержит его фиксированный размер:
int[8] arr;
Тип массива arr - int[8]. Обратите внимание, что размер массива указан рядом с
типом, а не после имени переменной, как в C/C++.
Динамические массивы хранятся в куче и могут увеличиваться или уменьшаться во
время выполнения программы. Динамический массив можно создать с помощью ключевого слова new и указания размера:
int size = 8; // run-time переменная
int[] arr = new int[size];
Тип массива arr - int[], который является срезом (slice) и будет рассмотрен
более подробно в следующем разделе. Многомерные массивы можно легко создать, используя синтаксис auto arr = new int[3][3].
Массивы можно объединять с помощью оператора конкатенации ~, который создаст новый
динамический массив.
Математические операции могут быть применены ко всему массиву с использованием
синтаксиса c[] = a[] + b[], который, например, сложит все элементы a и
b, то есть получится c[0] = a[0] + b[0], c[1] = a[1] + b[1] и т.д. Также
возможно выполнять операции со всем массивом, используя только одно значение:
a[] *= 2; // умножить все элементы на 2
a[] %= 26; // вычисление по модулю 26 для всего массива `a`
Такие операции могут быть оптимизированы компилятором таким образом, чтобы были использованы специальные инструкции процессоров, которые выполняют операции в один приём.
У обоих типов массивов есть свойство .length. Его можно только читать в
случае статических массивов, а в случае динамических массивов его можно также записывать, чтобы динамически изменять их размер. Свойство .dup создаёт копию массива.
При индексации массива с помощью синтаксиса arr[idx] специальный синтаксис
$ означает длину массива. Например, arr[$ - 1] ссылается на последний
элемент и является короткой формой записи arr[arr.length - 1].
Завершите функцию encrypt, чтобы расшифровать тайное послание.
Текст должен быть зашифрован с помощью шифра Цезаря, который сдвигает символы
в алфавите, используя определённый индекс. Шифруемый текст содержит только символы из диапазона a-z, что облегчает задачу.