Перейти к содержанию

Константы и перечисляемые типы

Константы

Константы — это неизменяемые значения в программе. Используются для создания мнемонических имён для каких-либо "недвижимых" данных — например, математических констант вроде π или e.

Синтаксис схож с объявлением переменных, за исключением того, что практически всегда вместо типа указывается ключевое слово const — и ZScript сам подбирает подходящий тип данных:

const идентификатор_константы = значение;

// Примеры:
const playerMinSize = 3;
const playerMaxSize = 20;

const winString = "You win! Congratulations!";
const looseString = "You loose...";

const monsterXMultiplier = 4.444;

Quote

JSO_x: на простых значениях аналог #define в C/C++, а не const, как можно было бы подумать. На сложных и составных типах не работает, ZScript местами ограничен в самых неожиданных местах.

Перечисляемый тип

Он же "перечислимый тип", он же "перечисление", он же "enumerated type", изредка можно услышать "енумерат". Грубо говоря, это целочисленные константы в форме записи, удобной для перечислений. Почему удобной? Потому что есть автоматический инкремент (прибавление единицы) для следующего значения, если не указано что-либо другое. Почему константы? Ну... неизменяемые.

Объявляется перечисление с ключевого слова enum, после которого следует идентификатор типа и открывающая операторная скобка. Затем, через запятую, список целочисленных "констант" без ключевого слова const; в конце — закрывающая операторная скобка, как в блоке кода ниже.

Опциональность части синтаксиса

Во всех блоках кода ниже [Квадратные скобки] используются для того, чтобы обозначить необязательность написания того, что заключено внутри них.

enum имя_перечисляемого_типа {
     имя1 [= значение],
    [имя2 [= значение],]
    []
}

// Пример:

enum WeekDays {
    Monday = 1,
    Tuesday = 2,
    Wednesday = 3,
    Thursday = 4,
    Friday = 5,
    Saturday = 6,
    Sunday = 7      // На последней строке запятая возможна, но её допустимо не ставить.
}

Если значения не указаны, то берётся "0" для первого и "(+1 от предыдущего значения)" для последующих. Таким образом достигается полная автоматизированность — можно просто перечислить все нужные идентификаторы подряд (и затем даже не задумываться, какие у них значения).

Одинаковые числа для разных имён в перечислимых типах ZScript вполне законны.

Примеры:

// Номера стандартных цветов в текстовых режимах адаптера EGA
//(что-то, что позволит показать, собственно, перечислимость):
enum EGAColors {
    EGA_Black = 0,  // Он авто-инициализируется нулём, и на самом деле явно "0" можно не записывать.
    EGA_DarkBlue,   // "EGA_Black + 1" == 1;
    EGA_DarkGreen,  // "EGA_DarkBlue + 1" == 2;
    EGA_Cyan,       // "EGA_DarkGreen + 1" == 3;
    EGA_DarkRed,    // 4;
    EGA_Purple,     // 5...
    EGA_Brown,
    EGA_LightGray,
    EGA_DarkGray,
    EGA_Blue,
    EGA_LightGreen,
    EGA_LightBlue,
    EGA_LightRed,
    EGA_Pink,       // ...
    EGA_Yellow,     // 14;
    EGA_White       // 15.
}


// Просто некие числа для демонстрации остальных возможностей перечисляемого типа.
enum ETestNumbers {
    TN_One = 1,             // 1;
    TN_Two,                 // 2;
    TN_Couple = TE_Two,     // Также 2;
    TN_Three,               // 3;
    TN_Four,                // 4;
    TN_Five,                // 5;
    TN_Ten = 10,            // 10;
    TN_Eleven,              // 11;
    TN_Twelve = TE_Ten + 2, // 12;
    TN_Dozen = TE_Twelve    // Тоже 12.
}