Specyfikatory w Verse opisują zachowanie powiązane z semantyką i można dodawać specyfikatory do identyfikatorów oraz określonych słów kluczowych. Składnia specyfikatora zawiera nawiasy ostre (< i >), między którymi umieszcza się słowo kluczowe. Na przykład w IsPuzzleSolved()<decides><transacts>:void specyfikatorami są "decides" i "transacts".
Atrybuty w Verse opisują zachowanie używane poza językiem Verse (w przeciwieństwie do specyfikatorów, które opisują semantykę języka Verse). Składnia atrybutu wykorzystuje symbol at (@), po którym następuje słowo kluczowe, np. @editable.
W poniższych sekcjach opisano wszystkie specyfikatory i atrybuty dostępne w Verse oraz okoliczności, w których się je stosuje.
Specyfikatory efektów
Efekty w Verse wskazują kategorie zachowania, jakie funkcja może przejawiać. Specyfikatory efektów można dodać do następujących elementów:
Po nawiasach
()w definicji funkcji:name()<specifier>:type = codeblock.Słowo kluczowe
class:name := class<specifier>(){}.
| Specyfikator | Opis | Przykład |
|---|---|---|
no_rollback | Jest to efekt domyślny stosowany, gdy nie zostanie wskazany żaden efekt wyłączny. Efekt |
|
transacts | Efekt |
|
allocates | Ten efekt wskazuje, że funkcja może tworzyć instancje obiektu w pamięci. Jeśli metoda zostanie wywołana w kontekście niepowodzenia, który zakończy się niepowodzeniem, efekty zostaną cofnięte. |
|
reads | Metoda z tym efektem może odczytywać ze stanu zmiennego. |
|
writes | Metoda z takim efektem może zapisywać do stanu zmiennego. Jeśli metoda zostanie wywołana w kontekście niepowodzenia, który zakończy się niepowodzeniem, efekty zostaną cofnięte. |
|
computes | Metoda |
|
converges | Ten efekt gwarantuje, że wykonanie powiązanej funkcji nie przynosi efektów ubocznych, a dodatkowo funkcja zostanie zrealizowana (nie podlega nieskończonej rekursji). Ten efekt może występować tylko w funkcjach z specyfikatorem native, którego kompilator nie sprawdza. Kod, który wprowadza wartości domyślne klasy lub wartości zmiennych globalnych musi zawierać ten efekt. |
|
decides | Ten efekt wskazuje, że funkcja może się zakończyć niepowodzeniem, a wywołanie takiej funkcji jest wyrażeniem zawodnym. Ponieważ funkcja |
|
suspends | Ten efekt wskazuje, że funkcja jest asynchroniczna. Tworzy asynchroniczny kontekst ciała funkcji. Wzajemnie wyklucza się z efektem |
|
W każdym przypadku wywołanie funkcji zawierające określony efekt wymaga, aby wywoływacz także zawierał dany efekt.
Specyfikatory dostępu
Specyfikatory dostępu określają, co i w jaki sposób może wchodzić w interakcje z elementem członkowskim. Specyfikatory dostępu można zastosować do następujących elementów:
Identyfikator elementu członkowskiego:
name<specifier> : type = valueSłowo kluczowe
varelementu członkowskiego:var<specifier> name : type = value
Specyfikator dostępu może być określony zarówno dla identyfikatora, jak i słowa kluczowego var dla zmiennej, aby rozróżnić, kto ma dostęp do odczytu i zapisu zmiennej. Na przykład poniższa zmienna MyInteger ma w identyfikatorze specyfikator public, dzięki czemu każdy może odczytać wartość, ale słowo kluczowe var ma specyfikator protected, aby tylko bieżąca klasa i podtypy mogły zapisywać w zmiennej.
var<protected> MyInteger<public>:int = 2| Specyfikator | Opis | Użycie | Przykład |
|---|---|---|---|
public | Identyfikator jest powszechnie dostępny. | Ten specyfikator można dodawać do następujących elementów:
| Verse |
protected | Dostęp do identyfikatora mają jedynie bieżąca klasa i dowolne podtypy. | Ten specyfikator można dodawać do następujących elementów:
| Verse |
private | Dostęp do identyfikatora jest możliwy tylko w bieżącym, bezpośrednio otaczającym go zakresie (którym może być moduł, klasa, struktura itp.). | Ten specyfikator można dodawać do następujących elementów:
| Verse |
internal | Dostęp do identyfikatora jest możliwy tylko w bieżącym, bezpośrednio otaczającym go module. Jest to domyślny poziom dostępu. | Ten specyfikator można dodawać do następujących elementów:
| Verse |
scoped | Dostęp do identyfikatora jest możliwy tylko w bieżącym zakresie i wszystkich otaczających go zakresach. Wszelkie zasoby uwidaczniane w Verse, które pojawiają się w pliku Assets.digest.Verse, będą miały specyfikator | Ten specyfikator można dodawać do następujących elementów:
| Verse |
Specyfikatory klas
Specyfikatory klas określają konkretne cechy klas lub ich elementów członkowskich, takie jak możliwość utworzenia podklasy danej klasy.
| Specyfikator | Opis | Przykład |
|---|---|---|
abstract | Jeśli klasa lub metoda klasy zawiera specyfikator | Verse |
castable | Wskazuje, że ten typ można dynamicznie rzutować. Specyfikator Typ | Verse |
concrete | Gdy klasa ma specyfikator | Verse |
unique | Do każdej instancji klasy unique w Verse przypisywana jest unikatowa tożsamość. Oznacza to, że nawet jeśli dwie instancje tej samej unikatowej klasy mają te same wartości pól, nie są one równe, ponieważ są różnymi instancjami. Dzięki temu można porównywać instancje unikatowych klas pod względem równości, porównując ich tożsamości. Klasy bez specyfikatora unique nie mają takiej tożsamości, dlatego można je porównywać pod względem równości tylko na podstawie wartości ich pól. Oznacza to, że klasy unikatowe można porównywać za pomocą operatorów `=` oraz `<>` i że są one podtypami typu comparable. | Verse |
final | Specyfikatora
| Verse |
final_super | Specyfikator W Scene Graph jest to konieczne dla bezpośrednich podtypów | Verse |
Specyfikator persystencji
Jeśli typ niestandardowy, jak np. klasa, posiada specyfikator <persistable>, oznacza to, że możesz użyć ich w swoich zmiennych weak_map o zasięgu modułowym i zachować ich wartości podczas sesji gry. Aby dowiedzieć się więcej na temat persystencji w Verse, patrz: Używanie persystentnych danych w Verse.
Specyfikator persystencji można stosować z następującymi typami. Pod tymi adresami można uzyskać więcej informacji.
Specyfikatory open i closed
Obecnie można ich używać tylko z wyliczeniami. Specyfikatory <open> i <closed> określają, w jaki sposób można zmienić definicję wyliczenia po opublikowaniu wyspy.
Specyfikatory open i closed można stosować z następującymi typami. Pod tymi adresami można uzyskać więcej informacji.
| Specyfikator | Opis | Przykład |
|---|---|---|
Open | Specyfikator, który obecnie ma zastosowanie tylko do wyliczeń. W otwartym wyliczeniu można dodać wartości lub zmienić ich kolejność albo zmienić go na wyliczenie zamknięte (<closed>). Otwarte wyliczenia najlepiej wykorzystywać, gdy oczekuje się, że liczba wartości w typie wyliczeniowym może w przyszłości wzrastać. Na przykład wyliczenie typów broni. | Verse |
Closed | Specyfikator, który obecnie ma zastosowanie tylko do wyliczeń. Wyliczenia są domyślnie zamknięte. Zamknięte wyliczenia najlepiej nadają się do zastosowań, w których wartości powinny pozostać takie same, na przykład dni tygodnia. | Verse |
Specyfikatory implementacji
Nie da się używać specyfikatorów implementacji podczas pisania kodu, jednak będą one widoczne przy przeglądaniu interfejsów API UEFN.
| Specyfikator | Opis | Przykład |
|---|---|---|
native | Wskazuje, że szczegóły definicji elementu są zaimplementowane w C++. Definicje Verse zawierające specyfikator
| Verse |
native_callable | Wskazuje, że metoda instancji jest zarówno natywna (zaimplementowana w C++), jak i może być wywoływana przez inny kod C++. Ten specyfikator jest używany w metodzie instancji. Nie propaguje się on do podklas, więc nie trzeba dodawać go do definicji podczas zastępowania metody, która ma ten specyfikator. | Verse |
Atrybuty
Atrybuty w Verse opisują zachowanie używane poza językiem Verse (w przeciwieństwie do specyfikatorów, które opisują semantykę języka Verse). Atrybuty można dodać do wiersza kodu przed definicjami.
Składnia atrybutu wykorzystuje symbol at (@), po którym następuje słowo kluczowe.
| Atrybut | Opis | Przykład |
|---|---|---|
editable | Wskazuje, że dane pole jest właściwością uwidocznioną, którą można zmieniać bezpośrednio z poziomu UEFN, więc zmiana jej wartości nie wymaga modyfikowania kodu Verse. Aby dowiedzieć się więcej, patrz Dostosowywanie właściwości urządzeń. | Verse |
editable_text_box | Edytowalny ciąg tekstowy, który jest wyświetlany jako pole tekstowe w edytorze. Obecnie edytowalne pola tekstowe nie obsługują podpowiedzi ani kategorii. Aby dowiedzieć się więcej, patrz Dostosowywanie właściwości urządzeń. | Verse |
editable_slider | Edytowalny suwak, który używa typu float. Suwak w edytorze można przeciągać, aby zwiększyć lub zmniejszyć wartość. Aby dowiedzieć się więcej, patrz Dostosowywanie właściwości urządzeń. | Verse |
editable_number | Edytowalna liczba z wartością minimalną i maksymalną. Aby dowiedzieć się więcej, patrz Dostosowywanie właściwości urządzeń. | Verse |
editable_vector_slider | Edytowalny suwak wektora. Wartość każdego z komponentów wektora można zmienić, przeciągając ją. Aby dowiedzieć się więcej, patrz Dostosowywanie właściwości urządzeń. | Verse |
editable_vector_number | Edytowalny numer wektora, który może przyjąć postać vector2, vector2i lub vector3. Aby dowiedzieć się więcej, patrz Dostosowywanie właściwości urządzeń. | Verse |
editable_container | Edytowalny kontener wartości. Obecnie obsługuje to tylko tablice. Aby dowiedzieć się więcej, patrz Dostosowywanie właściwości urządzeń. | Verse |