Dans Verse, les spécificateurs décrivent le comportement lié à la sémantique, et peuvent ajouter des spécificateurs aux identificateurs et à certains mots-clés. La syntaxe du spécificateur utilise le mot-clé entre des chevrons (< et >). Par exemple, dans IsPuzzleSolved()<decides><transacts>:void, "decides" et "transacts" sont des spécificateurs.
Les attributs dans Verse décrivent un comportement utilisé en dehors du langage Verse (contrairement aux spécificateurs, qui décrivent la sémantique de Verse). La syntaxe d'attribut utilise l'arobase (@) suivie du mot-clé, par exemple @editable.
Dans les rubriques suivantes, nous vous décrivons tous les spécificateurs et les attributs disponibles dans Verse et vous expliquons quand vous pouvez les utiliser.
Spécificateurs d'effets
Dans Verse, les effets indiquent les catégories de comportement qu'une fonction est autorisée à présenter. Vous pouvez ajouter des spécificateurs d'effet :
Après les
()dans une définition de fonction :name()<specifier>:type = codeblock.Le mot-clé
class:name := class<specifier>(){}.
| Spécificateur | Description | Exemple |
|---|---|---|
no_rollback | Il s'agit de l'effet par défaut lorsqu'aucun effet exclusif n'est spécifié. L'effet |
|
transacts | L'effet |
|
allocates | Cet effet indique que la fonction peut instancier un objet en mémoire. Si la méthode est appelée dans un contexte d'échec qui échoue, les effets sont annulés. |
|
reads | Une méthode disposant de cet effet peut effectuer la lecture à partir d'un état mutable. |
|
writes | Une méthode disposant de cet effet peut écrire sur un état mutable. Si la méthode est appelée dans un contexte d'échec qui échoue, les effets sont annulés. |
|
computes | Une méthode |
|
converges | Cet effet garantit non seulement qu'il n'y a pas d'effet secondaire lié à l'exécution de la fonction connexe, mais aussi que la fonction se termine définitivement (sans récursivité infinie). Cet effet peut apparaître uniquement dans les fonctions dotées du spécificateur native, bien que le compilateur n'effectue pas cette vérification. Le code qui fournit les valeurs par défaut des champs de classe ou les valeurs des variables globales doit avoir cet effet. |
|
decides | Cet effet indique que la fonction peut échouer et que l'appel de cette fonction est une expression faillible. Étant donné qu'une fonction |
|
suspends | Cet effet indique que la fonction est asynchrone. Crée un contexte asynchrone pour le corps de la fonction. Il est mutuellement exclusif avec l'effet |
|
Dans tous les cas, l'appel d'une fonction qui a un effet spécifique exige que l'appelant dispose également de cet effet.
Spécificateurs d'accès
Les spécificateurs d'accès définissent les éléments qui peuvent interagir avec un membre et leur mode d'interaction. Vous pouvez appliquer des spécificateurs d'accès aux éléments suivants :
L'identificateur d'un membre :
name<specifier> : type = valueLe mot clé
vard'un membre :var<specifier> name : type = value
Vous pouvez avoir un spécificateur d'accès à la fois sur l'identificateur et sur le mot-clé var pour une variable, pour différencier qui a accès à la lecture et à l'écriture de la variable. Par exemple, la variable suivante MyInteger a le spécificateur public sur l'identificateur afin que n'importe qui puisse lire la valeur, mais le mot-clé var a le spécificateur protégé afin que seuls la classe actuelle et les sous-types puissent écrire dans la variable.
var<protected> MyInteger<public>:int = 2| Spécificateur | Description | Utilisation | Exemple |
|---|---|---|---|
public | L'identificateur est universellement accessible. | Vous pouvez utiliser ce spécificateur sur :
| Verse |
protégé | L'identificateur n'est accessible qu'à la classe actuelle et à ses sous-types. | Vous pouvez utiliser ce spécificateur sur :
| Verse |
privé | Il est possible d'accéder à l'identificateur uniquement dans l'étendue actuelle, immédiatement englobante (que ce soit un module, une classe, une structure, etc.). | Vous pouvez utiliser ce spécificateur sur :
| Verse |
interne | Il est possible d'accéder à l'identificateur uniquement dans le module actuel, immédiatement englobant. Il s'agit du niveau d'accès par défaut. | Vous pouvez utiliser ce spécificateur sur :
| Verse |
À portée | L'identificateur n'est accessible que dans la portée actuelle et dans toutes les étendues englobantes. Toute ressource que vous exposez à Verse apparaissant dans le fichier Assets.digest.Verse a le spécificateur | Vous pouvez utiliser ce spécificateur sur :
| Verse |
Spécificateurs de classe
Les spécificateurs de classe définissent certaines caractéristiques des classes ou de leurs membres ; ils indiquent par exemple si vous pouvez créer une sous-classe d'une classe.
| Spécificateur | Description | Exemple |
|---|---|---|
abstract | Lorsqu'une classe ou une méthode de classe possède le spécificateur | Verse |
castable | Indique que ce type peut être dynamiquement converti. Le spécificateur Le type | Verse |
concrete | Lorsqu'une classe possède le spécificateur | Verse |
unique | À chaque classe unique dans Verse est attribuée une identité unique pour chaque instance. Cela signifie que, même si deux instances de la même classe unique ont les mêmes valeurs de champ, elles ne sont pas égales, car ce sont des instances distinctes. Cela permet aux instances de classes uniques d'être comparées en matière d'égalité selon leurs identités. Les classes sans spécificateur unique n'ont pas d'identité de ce type ; il est donc uniquement possible de comparer leur égalité sur la base des valeurs de leurs champs. Cela signifie que les classes `unique` peuvent être comparées avec les opérateurs = et <>, et sont des sous-types du type `comparable`. | Verse |
final | Vous ne pouvez utiliser le spécificateur
| Verse |
final_super | Le spécificateur Cela est nécessaire dans Scene Graph pour que les sous-types immédiats de | Verse |
Spécificateur de persistance
Lorsqu'un type personnalisé, tel qu'une classe, possède le spécificateur <persistable>, vous pouvez l'utiliser dans vos variables weak_map à étendue de module et faire persister ses valeurs d'une session de jeu à une autre. Pour en savoir plus sur la persistance dans Verse, consultez la page Utiliser des données persistantes dans Verse.
Le spécificateur persistable est utilisable avec les types suivants. Suivez les liens pour en savoir plus.
Spécificateurs Open et Closed
Actuellement disponibles uniquement avec les énumérations. Les spécificateurs <open> et <closed> déterminent la façon dont vous pouvez modifier la définition de l'énumération une fois votre île publiée.
Vous pouvez utiliser les spécificateurs open et closed avec les types suivants. Suivez les liens pour en savoir plus.
| Spécificateur | Description | Exemple |
|---|---|---|
Open | Spécificateur qui s'applique actuellement uniquement aux énumérations. Vous pouvez ajouter ou réorganiser les valeurs d'énumération dans une énumération ouverte, ou la convertir en énumération <closed>. Les énumérations ouvertes sont principalement utilisées lorsque vous prévoyez que le nombre de valeurs dans votre énumération peut augmenter à l'avenir. Par exemple, une énumération de types d'armes. | Verse |
Closed | Spécificateur qui s'applique actuellement uniquement aux énumérations. Les énumérations sont fermées par défaut. Les énumérations fermées conviennent mieux dans les cas où vos valeurs sont censées rester les mêmes, par exemple les jours de la semaine. | Verse |
Spécificateurs d'implémentation
Il n'est pas possible d'utiliser les spécificateurs d'implémentation lors de l'écriture du code ; vous verrez ultérieurement comment les utiliser dans les API de l'UEFN.
| Spécificateur | Description | Exemple |
|---|---|---|
native | Indique que les détails de la définition de l'élément sont implémentés en C++. Les définitions Verse avec le spécificateur
| Verse |
native_callable | Indique qu'une méthode d'instance est à la fois native (implémentée en C++) et peut être appelée par d'autres codes C++. Ce spécificateur est utilisé sur une méthode d'instance. Ce spécificateur ne se propage pas aux sous-classes, vous n'avez donc pas besoin de l'ajouter à une définition lorsque vous remplacez une méthode disposant de ce spécificateur. | Verse |
Attributs
Les attributs dans Verse décrivent un comportement utilisé en dehors du langage Verse (contrairement aux spécificateurs, qui décrivent la sémantique de Verse). Il est possible d'ajouter des attributs sur la ligne de code précédant les définitions.
La syntaxe d'attribut utilise l'arobase (@) suivie du mot-clé.
| Attribut | Description | Exemple |
|---|---|---|
editable | Indique que ce champ est une propriété exposée qui peut être modifiée directement à partir de l'UEFN. Vous n'avez donc pas besoin de modifier le code Verse pour changer sa valeur. Pour en savoir plus, consultez la rubrique Personnaliser les propriétés de l'appareil. | Verse |
editable_text_box | Une chaîne modifiable qui s'affiche sous forme de zone de texte dans l'éditeur. Les zones de texte modifiables ne prennent actuellement pas en charge les infobulles ni les catégories. Pour en savoir plus, consultez la rubrique Personnaliser les propriétés de l'appareil. | Verse |
editable_slider | Un curseur modifiable qui utilise le type float. Vous pouvez faire glisser le curseur dans l'éditeur pour augmenter ou diminuer la valeur. Pour en savoir plus, consultez la rubrique Personnaliser les propriétés de l'appareil. | Verse |
editable_number | Nombre modifiable avec une valeur minimum et une valeur maximum. Pour en savoir plus, consultez la rubrique Personnaliser les propriétés de l'appareil. | Verse |
editable_vector_slider | Un curseur vectoriel modifiable. Vous pouvez le faire glisser pour modifier les valeurs de chacun des composants vectoriels. Pour en savoir plus, consultez la rubrique Personnaliser les propriétés de l'appareil. | Verse |
editable_vector_number | Numéro de vecteur modifiable, qui peut être vector2, vector2i ou vector3. Pour en savoir plus, consultez la rubrique Personnaliser les propriétés de l'appareil. | Verse |
editable_container | Un conteneur de valeurs modifiable. Il ne prend actuellement en charge que les matrices. Pour en savoir plus, consultez la rubrique Personnaliser les propriétés de l'appareil. | Verse |