Menu

Массивы

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

Подробнее

rdmd playground.d