Gli specificatori in Verse descrivono un comportamento relativo alla semantica e possono aggiungere specificatori a identificatori e determinate parole chiave. La sintassi dello specificatore utilizza le parentesi angolari (< e >) con la parola chiave in mezzo. Ad esempio, in IsPuzzleSolved()<decides><transacts>:void, "decides" e "transacts" sono specificatori.
Gli attributi in Verse descrivono un comportamento che viene utilizzato al di fuori del linguaggio Verse (a differenza degli specificatori che descrivono la semantica di Verse). La sintassi degli attributi utilizza il segno at (@) seguito dalla parola chiave, ad esempio @editable.
Le sezioni seguenti descrivono tutti gli specificatori e gli attributi disponibili in Verse e i diversi casi di utilizzo.
Specificatori di effetto
Gli effetti in Verse indicano le categorie di comportamento che una funzione può assumere. Puoi aggiungere specificatori di effetto a:
Dopo
()in una definizione di funzione:name()<specifier>:type = codeblock.La parola chiave
class:name := class<specifier>(){}.
| Specificatore | Descrizione | Esempio |
|---|---|---|
no_rollback | È l'effetto predefinito quando non viene specificato un effetto esclusivo. L'effetto |
|
transacts | L'effetto |
|
allocates | Questo effetto indica che la funzione potrebbe istanziare un oggetto nella memoria. Se il metodo viene chiamato in un contesto di errore che non riesce, gli effetti vengono annullati. |
|
reads | Un metodo con questo effetto può leggere da uno stato mutabile. |
|
writes | Un metodo con questo effetto può scrivere in uno stato mutabile. Se il metodo viene chiamato in un contesto di errore che non riesce, gli effetti vengono annullati. |
|
computes | Un metodo |
|
converges | Questo effetto garantisce non solo che non ci siano effetti collaterali dall'esecuzione della funzione correlata, ma anche che la funzione si completi (non sia ricorsiva all'infinito). Questo effetto può essere visualizzato solo nelle funzioni che hanno lo specificatore native, ma ciò non viene controllato dal compilatore. Il codice che fornisce i valori predefiniti per i campi della classe o i valori delle variabili globali deve avere questo effetto. |
|
decides | Questo effetto indica che la funzione può non riuscire e che la chiamata a questa funzione è un'espressione fallibile. Poiché una funzione |
|
suspends | Questo effetto indica che la funzione è asincrona. Crea un contesto asincrono per il corpo della funzione. Si escludono a vicenda con l'effetto |
|
In tutti i casi, la chiamata di una funzione che ha un effetto specifico richiede che anche il chiamante abbia quell'effetto.
Specificatori di accesso
Gli specificatori di accesso definiscono cosa può interagire con un membro e in che modo. Gli specificatori di accesso possono essere applicati a quanto segue:
L'identificatore di un membro:
name<specifier> : type = valueLa parola chiave
varper un membro:var<specifier> name : type = value
Puoi avere uno specificatore di accesso sia sull'identificatore che sulla parola chiave var di una variabile per distinguere tra chi ha accesso per leggere e scrivere la variabile. Ad esempio, la seguente variabile MyInteger ha lo specificatore pubblico sull'identificatore in modo che chiunque possa leggere il valore, ma la parola chiave var ha lo specificatore protetto in modo che solo la classe e i sottotipi correnti possano scrivere nella variabile.
var<protected> MyInteger<public>:int = 2| Specificatore | Descrizione | Utilizzo | Esempio |
|---|---|---|---|
public | L'identificatore è universalmente accessibile. | Puoi utilizzare questo specificatore su:
| Verse |
protected | L'identificatore può essere consultato solo alla classe corrente e agli eventuali sottotipi. | Puoi utilizzare questo specificatore su:
| Verse |
private | L'identificatore può essere consultato solo nell'ambito corrente, di inclusione immediata (sia esso un modulo, una classe, una struttura ecc.). | Puoi utilizzare questo specificatore su:
| Verse |
internal | L'identificatore può essere consultato solo nel modulo corrente di inclusione immediata. È il livello di accesso predefinito. | Puoi utilizzare questo specificatore su:
| Verse |
scoped | È possibile accedere all'identificatore solo nell'ambito corrente e in tutti gli ambiti di inclusione. Tutti gli asset che esponi a Verse e che appaiono nel file Assets.digest.Verse avranno lo specificatore | Puoi utilizzare questo specificatore su:
| Verse |
Specificatori di classe
Gli specificatori di classe definiscono alcune caratteristiche delle classi o dei loro membri, come la possibilità di creare una sottoclasse di una classe.
| Specificatore | Descrizione | Esempio |
|---|---|---|
abstract | Quando una classe o un metodo di classe ha lo specificatore | Verse |
castable | Indica che questo tipo è dinamicamente lanciabile. Lo specificatore Il tipo | Verse |
concrete | Quando una classe ha lo specificatore | Verse |
unique | A una classe unique in Verse viene assegnata un'identità univoca per ogni istanza. Ciò significa che, anche se due istanze della stessa classe univoca hanno gli stessi valori di campo, non sono uguali poiché sono istanze distinte. Ciò consente di verificare l'uguaglianza tra istanze di classi univoche confrontando le loro identità con gli operatori =, < e >, il che le rende sottotipi del tipo confrontable. Le classi prive dello specificatore univoco non hanno tale identità e quindi si possono confrontare solo per l'uguaglianza in base ai valori dei loro campi. Ciò significa che le classi univoche si possono confrontare con gli operatori = e <> e sono sottotipi del tipo confrontabile. | Verse |
final | È possibile utilizzare lo specificatore
| Verse |
final_super | Lo specificatore Ciò è necessario in Scene Graph per i sottotipi immediati di | Verse |
Specificatore di persistenza
Quando un tipo personalizzato, come ad esempio una classe, presenta uno specificatore <persistable>, significa che puoi usarlo nelle tue variabili weak_map con ambito modulo e far sì che i loro valori persistano nelle varie sessioni di gioco. Per ulteriori dettagli sulla persistenza in Verse, consulta Utilizzo dei dati persistenti in Verse.
Puoi utilizzare lo specificatore persistente con i seguenti tipi. Segui i link per avere ulteriori dettagli.
Specificatori aperti e chiusi
Attualmente utilizzabili solo con le enumerazioni. Gli specificatori <open> e <closed> determinano come puoi modificare la definizione dell'enum una volta pubblicata la tua isola.
Puoi utilizzare gli specificatori open e closed con i seguenti tipi. Segui i link per avere ulteriori dettagli.
| Specificatore | Descrizione | Esempio |
|---|---|---|
Open | Specificatore attualmente applicabile solo alle enumerazioni. Puoi aggiungere o riordinare i valori di un'enumerazione aperta, o modificarla in un'enum di tipo <closed>. Le enumerazioni aperte sono ideali quando si prevede che il numero di valori intrinsechi possa aumentare in futuro. Ad esempio, un'enumerazione di tipi di armi. | Verse |
Enum chiusa | Specificatore attualmente applicabile solo alle enumerazioni. Le enumerazioni sono chiuse per impostazione predefinita. Le enumerazioni chiuse sono ideali nei casi in cui si prevede che i valori dell'enum rimangano invariati (ad esempio per i giorni della settimana). | Verse |
Specificatori di implementazione
Mentre non potrai utilizzare gli specificatori di implementazione quando scrivi il codice, potrai visualizzarli nelle API UEFN.
| Specificatore | Descrizione | Esempio |
|---|---|---|
native | Indica che i dettagli di definizione dell'elemento sono implementati in C++. Le definizioni di Verse con lo specificatore
| Verse |
native_callable | Indica che un metodo di istanza è nativo (implementato in C++) e può essere richiamato da altro codice C++. Puoi vedere questo specificatore utilizzato su un metodo di istanza. Questo specificatore non si propaga alle sottoclassi e quindi non è necessario aggiungerlo a una definizione, quando esegui l'override di un metodo che include lo specificatore stesso | Verse |
Attributi
Gli attributi in Verse descrivono un comportamento che viene utilizzato al di fuori del linguaggio Verse (a differenza degli specificatori, che descrivono la semantica di Verse). Gli attributi possono essere aggiunti nella riga di codice prima delle definizioni.
La sintassi degli attributi utilizza il simbolo @ (@) seguito dalla parola chiave.
| Attributo | Descrizione | Esempio |
|---|---|---|
editable | Indica che questo campo è una proprietà esposta che può essere modificata direttamente tramite UEFN, quindi non è necessario modificare il codice Verse per cambiarne il valore. Per maggiori dettagli, vedi Personalizzare le proprietà di un dispositivo. | Verse |
editable_text_box | Stringa modificabile che viene visualizzata come casella di testo nell'editor. Le caselle di testo modificabili attualmente non supportano i suggerimenti o le categorie. Per maggiori dettagli, vedi Personalizzare le proprietà di un dispositivo. | Verse |
editable_slider | Cursore modificabile che utilizza il tipo float. Puoi trascinare il cursore nell'editor per aumentare o diminuire il valore. Per maggiori dettagli, vedi Personalizzare le proprietà di un dispositivo. | Verse |
editable_number | Numero modificabile con minimo e massimo. Per maggiori dettagli, vedi Personalizzare le proprietà di un dispositivo. | Verse |
editable_vector_slider | Cursore vettoriale modificabile. Puoi trascinare per modificare i valori di ciascuno dei componenti del vettore. Per maggiori dettagli, vedi Personalizzare le proprietà di un dispositivo. | Verse |
editable_vector_number | Numero vettoriale modificabile che può essere vector2, vector2i o vector3. Per maggiori dettagli, vedi Personalizzare le proprietà di un dispositivo. | Verse |
editable_container | Contenitore di valori modificabile. Attualmente, supporta solo gli array. Per maggiori dettagli, vedi Personalizzare le proprietà di un dispositivo. | Verse |