Спецификаторы в Verse описывают поведение, связанное с семантикой. Спецификаторы можно добавлять к идентификаторам и некоторым ключевым словам. Для спецификаторов используется синтаксис с угловыми скобками (< и >), между которыми располагается ключевое слово. Например, в IsPuzzleSolved()<decides><transacts>:void, "decides" и "transacts" являются спецификаторами.
Атрибуты в Verse описывают поведение, определяемое за рамками самого языка Verse (в отличие от спецификаторов, которые описывают семантику Verse). Их синтаксис подразумевает использование знака at (@), за которым идёт ключевое слово, например @editable.
Далее описаны все спецификаторы и атрибуты в Verse, а также то, когда их можно использовать.
Спецификаторы эффектов
Эффекты в Verse указывают категории поведения, допустимые для функции. Вы можете добавлять спецификаторы эффектов следующим образом:
К круглым скобкам
()после имени в определении функции:name()<specifier>:type = codeblock.К ключевому слову
class:name := class<specifier>(){}.
| Спецификатор | Описание | Пример |
|---|---|---|
no_rollback | Это эффект, используемый по умолчанию, если не указан исключительный эффект. Эффект |
|
transacts | Эффект |
|
allocates | Этот эффект указывает на то, что функция может создавать экземпляр объекта в памяти. Если метод вызывается в контексте, который допускает неоднозначность и не выполняется, эффекты аннулируются. |
|
reads | Метод с этим эффектом может читать из изменяемого состояния. |
|
writes | Метод с этим эффектом может записывать в изменяемое состояние. Если метод вызывается в контексте, который допускает неоднозначность и не выполняется, эффекты аннулируются. |
|
computes | Метод |
|
converges | Этот эффект гарантирует не только отсутствие побочных эффектов при выполнении соответствующей функции, но и то, что функция завершится (без бесконечной рекурсии). Этот эффект может применяться только к функциям со спецификатором native, однако проверка компилятором на это не выполняется. Для этого эффекта необходим код, который используется для предоставления значений по умолчанию для полей класса или значений для глобальных переменных. |
|
decides | Этот эффект указывает на то, что функция может завершиться ошибкой и что вызов этой функции является выражением с неоднозначным результатом. Поскольку функция |
|
suspends | Этот эффект указывает на то, что функция является асинхронной. Создаёт асинхронный контекст для тела функции. Взаимоисключающий эффект с эффектом |
|
В любом случае, вызов функции, которая имеет определённый эффект, потребует от вызывающей функции наличия аналогичного эффекта.
Спецификаторы доступа
Спецификаторы доступа определяют, что и как может взаимодействовать с составляющей. Спецификаторы обращения можно применять к следующим элементам:
К идентификатору составляющей:
name<specifier> : type = valueК ключевому слову
varдля составляющей:var<specifier> name : type = value
У вас может быть спецификатор обращения как для идентификатора, так и для ключевого слова var для переменной, чтобы различать, какой элемент может только считывать переменную, а какой — записывать в неё. Например, следующая переменная MyInteger содержит спецификатор public в идентификаторе, поэтому считывать её значения может что угодно, но ключевое слово var имеет спецификатор protected, поэтому записывать в переменную могут только текущий класс и подтипы.
var<protected> MyInteger<public>:int = 2| Спецификатор | Описание | Использование | Пример |
|---|---|---|---|
public | Идентификатор доступен из других частей кода. | Спецификатор можно использовать для следующих типов:
| Verse |
protected | Идентификатор доступен только для текущего класса и любых подтипов. | Спецификатор можно использовать для следующих типов:
| Verse |
private | К идентификатору можно обращаться только в текущей, непосредственно охватывающие его области видимости (будь то модуль, класс, структура и т. д.). | Спецификатор можно использовать для следующих типов:
| Verse |
internal | К идентификатору можно обращаться только в текущей, непосредственно охватывающей области видимости в пределах модуля. Это уровень обращения по умолчанию. | Спецификатор можно использовать для следующих типов:
| Verse |
scoped | К идентификатору можно обращаться только в текущей области видимости и всех охватывающих областях видимости. Любые ресурсы, выведенные в Verse и появившиеся в файле Assets.digest.Verse, будут иметь спецификатор | Спецификатор можно использовать для следующих типов:
| Verse |
Спецификаторы класса
Спецификаторы классов определяют характеристики классов или их составляющих, например, возможность создавать подкласс класса.
| Спецификатор | Описание | Пример |
|---|---|---|
abstract | Когда класс или метод класса имеет спецификатор | Verse |
castable | Указывает на то, что этот тип является динамическим приведением. Спецификатор Тип | Verse |
concrete | Когда класс имеет спецификатор | Verse |
unique | Уникальному классу в Verse присваивается уникальный идентификатор для каждого экземпляра. Это означает, что, даже если два экземпляра одного и того же уникального класса имеют одинаковые значения полей, они не равны, поскольку являются разными экземплярами. Это позволяет определить, одинаковы экземпляры уникальных классов или нет, сравнивая их идентификаторы. Классы без спецификатора unique не имеют таких идентификаторов, поэтому их можно оценивать на эквивалентность только на основе значений их полей. Это означает, что уникальные классы можно сравнивать с помощью операторов = и <> и они являются подтипами типа comparable. | Verse |
final | Спецификатор
| Verse |
final_super | Спецификатор Это необходимо в Scene Graph для непосредственных подтипов | Verse |
Спецификатор сохранения данных
Когда пользовательский тип, например класс, имеет спецификатор <persistable>, это означает, что вы можете использовать его в переменных weak_map, входящих в область видимости модуля, и его значения будут сохраняться в течение всех игровых сеансов. Подробнее о сохраняемых элементах в Verse см. в статье Использование сохраняемых данных в Verse.
Спецификатор persistable можно использовать со следующими типами. Переходите по ссылкам, чтобы узнать о них подробнее.
Спецификаторы open и closed
В настоящее время их можно использовать только с перечислениями. Спецификаторы <open> и <closed> задают, как можно изменять определение перечисления после публикации острова.
Спецификаторы open и closed можно использовать со следующими типами. Переходите по ссылкам, чтобы узнать о них подробнее.
| Спецификатор | Описание | Пример |
|---|---|---|
Open | Спецификатор, который в настоящее время применяется только к перечислениям. Вы можете добавлять или изменять порядок значений в открытом перечислении или заменить его на <closed> (закрытое) перечисление. Открытые перечисления лучше использовать, если в дальнейшем количество значений в них увеличится. Пример: перечисление типов оружия. | Verse |
Закрытые | Спецификатор, который в настоящее время применяется только к перечислениям. Перечисления по умолчанию являются закрытыми. Закрытое перечисление лучше использовать в случаях, когда значения должны оставаться постоянными, например для дней недели. | Verse |
Спецификаторы реализации
Использование спецификаторов реализации при написании кода невозможно, однако вы увидите их при просмотре API UEFN.
| Спецификатор | Описание | Пример |
|---|---|---|
native | Указывает, что детали определения элемента реализованы на C++. Определения в Verse со спецификатором
| Verse |
native_callable | Указывает на то, что метод экземпляра относится к категории native (т. е. реализован на C++) и может быть вызван кодом C++ из другого места. Вы можете увидеть, что этот спецификатор используется для метода экземпляра. Этот спецификатор не распространяется на подклассы, поэтому его не нужно добавлять к определению при переопределении метода, имеющего этот спецификатор | Verse |
Свойства
Атрибуты в Verse описывают поведение, определяемое за рамками самого языка Verse (в отличие от спецификаторов, которые описывают семантику Verse). Их можно добавлять в строку, предшествующую коду с дальнейшим определением.
Их синтаксис подразумевает использование знака (@), за которым идёт ключевое слово.
| Свойство | Описание | Пример |
|---|---|---|
editable | Указывает на то, что это поле является выведенным свойством, которое может быть изменено непосредственно в UEFN, поэтому нет необходимости вносить изменения в код Verse, чтобы изменить его значение. Более подробно это описано в разделе Настройка свойств устройства. | Verse |
editable_text_box | Редактируемая строка, которая отображается в виде текстового поля в редакторе. В настоящее время редактируемые текстовые поля не поддерживают всплывающие подсказки и категории. Подробнее: Настройка свойств устройства. | Verse |
editable_slider | Редактируемый ползунок, который использует тип float. Вы можете перетаскивать ползунок в редакторе, чтобы увеличить или уменьшить значение. Подробнее: Настройка свойств устройства. | Verse |
editable_number | Редактируемое число с минимальным и максимальным значениями. Подробнее: Настройка свойств устройства. | Verse |
editable_vector_slider | Редактируемый векторный ползунок. Значения каждого из компонентов вектора можно изменить перетаскиванием. Подробнее: Настройка свойств устройства. | Verse |
editable_vector_number | Редактируемый номер вектора, может быть vector2, vector2i или vector3. Подробнее: Настройка свойств устройства. | Verse |
editable_container | Редактируемый контейнер значений. В настоящее время поддерживает только массивы. Подробнее: Настройка свойств устройства. | Verse |