В 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
, что облегчает задачу.