# Enums.txt

**Перечисляемый тип** или **перечисление** - это набор констант (называемых *полями перечисления*), имеющих общее имя (*имя перечисления*).

Перечисления имеют несколько преимуществ перед обычными константами. Они не засоряют общее пространство имен и являются участниками системы типов. Параметры, у которых перечисление является типом, имеют ограниченную область допустимых значений, что помогает избегать ошибок, связанных с неверным значением параметра.

**Enums.txt** - это текстовый файл, который содержит перечисления, доступные для [режима редактирования](https://docs.sannybuilder.com/ru/edit-modes).

## Формат файла

Каждое перечисление задается следующим образом:

`enum <имя перечисления>`\
`<поля перечисления>`\
`end`

`имя перечисления` - это любая комбинация букв, цифр и `_` \
`поля перечисления` - одна или несколько строк в формате: &#x20;

`<имя поля> [= <значение поля>]`

`имя поля` - любая комбинация букв, цифр и `_` \
`значение поля` - число или строковый литерал, заключенный в двойные кавычки. Если отсутствует, компилятор присваивает [новую константу](#format-faila) автоматически.

```
enum Town
  LS = 0
  SF = 1
  LV = 2
end
```

Поля перечисления могут разделяться переносом строки (как в примере выше) или запятой:

```
enum Town
  LS = 0, SF = 1, LV = 2
end
```

В одном файле может быть несколько перечислений. Каждое из них должно иметь уникальное имя.

{% hint style="warning" %}
Файл с перечислениями не может содержать комментарии или незнакомый синтаксис.
{% endhint %}

### Поля перечисления

Каждое поле перечисления представляет собой константу, которая присваивается явно либо неявно. Явным образом это происходит, если после имени поля стоит знак `=` и допустимая константа:

```
enum Town
  LS = 0
  SF = 1
  LV = 2
end
```

`Town.LS` представляет число `0`, `Town.SF` представляет число `1` и `Town.LV` представляет число `2`.

```
enum TicTacToe
   Player1 = "X"
   Player2 = "O"
end
```

`TicTacToe.Player1` представляет строковый литерал `X` и `TicTacToe.Player2` представляет строковый литерал `O`.

Если полю перечисления явным образом не присвоена константа, это происходит автоматически. Первому полю присваивается `0`, второму `1`, третьему `2` и т.д.:

```
enum Town
  LS
  SF
  LV
end
```

`Town.LS` представляет число `0`, `Town.SF` представляет число `1` и `Town.LV` представляет число `2`.

Если в одном перечислении используются и явное, и неявное присвоения, это происходит по следующим правилам:

* полю, которое следует за явно присвоенным числом, присваивается это число плюс 1:

```
enum E
  A = 10
  B
  C = 100
  D
  E
end
```

`E.A` = `10`, `E.B` = `11`, `E.C` = `100`, `E.D` = `101`, `E.E` = `102`

* полю, которое следует за явно присвоенным строковым литералом, присваивается литерал, дублирующий имя поля:

```
enum Month
  Jan = "January"
  Feb = "February"
  March
end
```

`Month.Jan` = `"January"`, `Month.Feb` = `"February"`, `Month.March` = `"March"`

{% hint style="warning" %}
Перечисление не может одновременно представлять числа и строковые литералы. Тип перечисления определяется по первой явно присвоенной константе:

```
enum Int
  X, Y // X = 0, Y = 1,
end
enum String
  X, Y = "Y" // X = "X", Y = "Y"
end
```

{% endhint %}
