Перечисление используется для определения именованных константных значений. Перечисляемый тип объявляется с использованием ключевого слова enum.
Простейшей формой определения перечисления является следующая:
enum имя_перечисления { список_перечисления }
Где,
имя_перечисления станет именем перечислимого типа.
список_перечисления – список идентификаторов, разделённых запятыми.
Каждый из символов в списке перечислений обозначает целочисленное значение, большее, чем предшествующий ему символ. По умолчанию значение первого символа перечисления равно 0. Например:
enum Days { sun, mon, tue, wed, thu, fri, sat };
Следующий пример демонстрирует использование переменной-перечисления:
import std.stdio; enum Days { sun, mon, tue, wed, thu, fri, sat }; int main(string[] args) { Days day; day = Days.mon; writefln("Сегодня: %d", day); writefln("Пятница: %d", Days.fri); return 0; }
Компиляция и выполнение приведённого выше кода даст следующий результат:
Сегодня: 1 Пятница: 5
В приведенной выше программе мы видим, как можно использовать перечисление. Изначально мы создаём переменную с именем day с типом Days – нашего объявленного перечисления. Затем мы устанавливаем его в mon, используя нотацию с оператором точки. Нам нужно использовать метод writefln для вывода значения mon, которое было сохранено. Вам также нужно указать тип. Он имеет тип integer, поэтому мы используем %d для печати.
В приведенном выше примере для перечисления используется имя Days и такие типы называются именованными перечислениями (named enums). Эти именованные перечисления обладают следующими свойствами:
init − Этим значением инициализируется первое значение в перечислении.
min − Возвращает наименьшее значение перечисления.
max − Возвращает наибольшее значение перечисления.
sizeof − Возвращает размер используемой памяти для перечисления.
Изменим предыдущий пример, чтобы использовать свойства.
import std.stdio; // Инициализируем sun значением 1 enum Days { sun = 1, mon, tue, wed, thu, fri, sat }; int main(string[] args) { writefln("Min : %d", Days.min); writefln("Max : %d", Days.max); writefln("Size of: %d", Days.sizeof); return 0; }
Компиляция и выполнение приведённого выше кода даст следующий результат:
Min : 1 Max : 7 Size of: 4
Перечисление без имени называется анонимным перечислением (anonymous enum). Ниже приведен пример анонимного перечисления.
import std.stdio; enum { sun , mon, tue, wed, thu, fri, sat }; int main(string[] args) { writefln("Воскресенье : %d", sun); writefln("Понедельник : %d", mon); return 0; }
Компиляция и выполнение приведённого выше кода даст следующий результат:
Воскресенье : 0 Понедельник : 1
Анонимные перечисления работают почти так же, как и именованные, но у них нет свойств max, min и sizeof.
Ниже приведен синтаксис для перечисления с базовым типом.
enum :базовыйТип { список_перечисления }
Вот примеры некоторых возможных базовых типов: long, int, string. Пример с использованием string показан ниже.
import std.stdio; enum : string { A = "привет", B = "мир", } int main(string[] args) { writefln("A : %s", A); writefln("B : %s", B); return 0; }
Компиляция и выполнение приведённого выше кода даст следующий результат:
A : привет B : мир
Перечисление в D предоставляет такие возможности, как инициализация нескольких значений в перечислении различными типами. Пример показан ниже.
import std.stdio; enum { A = 1.2f, // A – это 1.2f типа float B, // B – это 2.2f типа float int C = 3, // C – это 3 типа int D // D – это 4 типа int } int main(string[] args) { writefln("A : %f", A); writefln("B : %f", B); writefln("C : %d", C); writefln("D : %d", D); return 0; }
Компиляция и выполнение приведённого выше кода даст следующий результат:
A : 1.200000 B : 2.200000 C : 3 D : 4
От переводчика:
Почему-то авторы не написали про чаще всего используемый вариант, объявление констант. Так что напишу от себя.
Если у анонимных перечислений все элементы явно инициализуются каким-либо значением, то фигурные скобки можно опустить. Таким образом использование ключевого слова enum становится объявлением констант, значение которых вычисляется во время компиляции:
import std.stdio; enum A = 1.2f, // A – это 1.2f типа float B = 6.7, // B – это 6.7 типа double C = 3, // C – это 3 типа int D = "привет"; // D – это "привет" типа string int main(string[] args) { writefln("A : %f", A); writefln("B : %f", B); writefln("C : %d", C); writefln("D : %s", D); return 0; }
Компиляция и выполнение приведённого выше кода даст следующий результат:
A : 1.200000 B : 6.700000 C : 3 D : привет