Los especificadores en Verse describen el comportamiento relacionado con la semántica; es posible añadir especificadores a los identificadores y a ciertas palabras clave. La sintaxis de los especificadores utiliza corchetes angulares (< y >) con la palabra clave en medio. Por ejemplo, en IsPuzzleSolved()<decides><transacts>:void, "decides" y "transacts" son especificadores.
Los atributos en Verse describen un comportamiento que se utiliza fuera del lenguaje de Verse (a diferencia de los especificadores, que describen la semántica de Verse). La sintaxis de los atributos utiliza el signo de arroba (@) seguido de la palabra clave, por ejemplo @editable.
Las siguientes secciones describen todos los especificadores y atributos disponibles en Verse y cuándo se pueden utilizar.
Especificadores de efectos
Los efectos en Verse indican categorías de comportamiento que puede mostrar una función. Puedes añadir especificadores en los siguientes casos:
Después del
()en una definición de función:name()<specifier>:type = codeblock.La palabra clave
class:name := class<specifier>(){}.
| Especificador | Descripción | Ejemplo |
|---|---|---|
no_rollback | Este es el efecto predeterminado cuando no se especifica ningún efecto exclusivo. El efecto |
|
transacts | El efecto |
|
allocates | Este efecto indica que la función puede instanciar un objeto en la memoria. Si se llama al método en un contexto de fallo que falla, se deshacen los efectos. |
|
reads | Un método con este efecto puede leer desde un estado mutable. |
|
writes | Un método con este efecto puede escribir en un estado mutable. Si se llama al método en un contexto de fallo que falla, se deshacen los efectos. |
|
computes | Un método |
|
converges | Este efecto garantiza que no solo no hay ningún efecto secundario de la ejecución de la función relacionada, sino que la función se completa (no es infinitamente recursiva). Este efecto solo puede aparecer en funciones que tengan el especificador nativo, pero el compilador no lo comprueba. El código que proporciona valores predeterminados de campos de clases o valores para las variables globales debe tener este efecto. |
|
decides | Este efecto indica que la función puede fallar y que llamar a esta función es una expresión falible. Como una función |
|
suspends | Este efecto indica que la función es asíncrona. Crea un contexto asíncrono para el cuerpo de la función. Mutuamente excluyente con el efecto |
|
En todos los casos, llamar a una función que tiene un efecto específico requerirá que el autor de la llamada tenga también ese efecto.
Especificadores de acceso
Los especificadores de acceso definen qué puede interactuar con un miembro y cómo. Puedes aplicar especificadores de acceso a lo siguiente:
El identificador de un miembro:
name<specifier> : type = valueLa palabra clave
varde un miembro:var<specifier> name : type = value
Puedes tener un especificador de acceso tanto en el identificador como en la palabra clave var de una variable, para diferenciar quién tiene acceso de lectura y escritura en la variable. Por ejemplo, la siguiente variable MyInteger tiene el especificador «public» en el identificador para que cualquiera pueda leer el valor, pero la palabra clave var tiene el especificador «protected» para que solo la clase y los subtipos actuales puedan escribir en la variable.
var<protected> MyInteger<public>:int = 2| Especificador | Descripción | Función | Ejemplo |
|---|---|---|---|
público | El identificador es de acceso universal. | Es posible usar este especificador en:
| Verse |
protegido | Solo pueden acceder al identificador la clase actual y sus subtipos. | Es posible usar este especificador en:
| Verse |
privado | Solo se puede acceder al identificador en el ámbito actual e inmediatamente adyacente (ya sea un módulo, una clase, una estructura, etc.). | Es posible usar este especificador en:
| Verse |
interno | Solo se puede acceder al identificador en el módulo actual y envolvente inmediato. Este es el nivel de acceso predeterminado. | Es posible usar este especificador en:
| Verse |
seleccionado | Solo se puede acceder al identificador en el ámbito actual y en los ámbitos envolventes. Cualquier recurso que expongas a Verse y que aparezca en el archivo Assets.digest.Verse tendrá el especificador | Es posible usar este especificador en:
| Verse |
Especificadores de clase
Los especificadores de clase definen ciertas características de las clases o de sus miembros, por ejemplo, si es posible crear una subclase de una clase.
| Especificador | Descripción | Ejemplo |
|---|---|---|
abstract | Cuando una clase o un método de una clase tiene el especificador | Verse |
castable | Indica que este tipo se puede proyectar dinámicamente. El especificador El tipo | Verse |
concrete | Cuando una clase tiene el especificador | Verse |
unique | A una clase `unique` en Verse se le asigna una identidad `unique` para cada instancia. Esto significa que, aunque dos instancias de la misma clase `unique` tengan los mismos valores de campo, no son iguales, ya que son instancias distintas. Esto permite comparar instancias de clases únicas para la igualdad mediante la comparación de sus identidades. Las clases sin el especificador `unique` no tienen esta identidad, así que solo se pueden comparar para determinar su igualdad sobre la base de los valores de sus campos. Esto significa que las clases `unique` se pueden comparar con los operadores = y <>, y que son subtipos del tipo comparable. | Verse |
final | Solo puedes utilizar el especificador
| Verse |
final_super | El especificador Es obligatorio en Scene Graph para los subtipos inmediatos de | Verse |
Especificador de persistencia
Cuando un tipo personalizado, como una clase, tiene el especificador <persistable>, significa que puedes utilizarlo en las variables `weak_map` de tu ámbito de módulo y hacer que sus valores se mantengan a lo largo de las sesiones de juego. Para obtener más información sobre la persistencia en Verse, consulta la sección Cómo utilizar datos persistentes en Verse.
Puedes utilizar el especificador de persistencia con los siguientes tipos. Sigue los enlaces para obtener más información.
Especificadores abiertos y cerrados
Actualmente solo se puede utilizar con enumeraciones. Los especificadores <open> y <closed> determinan cómo puedes cambiar la definición de la enumeración una vez publicada tu isla.
Puedes utilizar los especificadores `open` y `closed` con los siguientes tipos. Sigue los enlaces para obtener más información.
| Especificador | Descripción | Ejemplo |
|---|---|---|
Open | Especificador que actualmente se aplica solo a las enumeraciones. Puedes añadir o reordenar valores de enumeración en una enumeración abierta, o cambiarla a una enumeración <closed>. Las enumeraciones abiertas se utilizan mejor cuando se espera que el número de valores de la enumeración aumente en el futuro. Por ejemplo, un enumeración de tipos de armas. | Verse |
Closed | Especificador que actualmente se aplica solo a las enumeraciones. Las enumeraciones están cerradas por defecto. Las enumeraciones cerradas funcionan mejor en los casos en los que se espera que los valores permanezcan iguales, como los días de la semana. | Verse |
Especificadores de implementación
No es posible utilizar especificadores de implementación al escribir código, pero sí verlos al examinar las API de UEFN.
| Especificador | Descripción | Ejemplo |
|---|---|---|
native | Indica que los detalles de definición del elemento están implementados en C++. Las definiciones de Verse con el especificador
| Verse |
native_callable | Indica que un método de instancia es nativo (implementado en C++) y puede llamarse desde otro código C++. Es posible ver este especificador utilizado en un método de instancia. Este especificador no se propaga a subclases y, en consecuencia, no es necesario añadirlo a una definición para anular otro método que sí lo tiene. | Verse |
Atributos
Los atributos en Verse describen un comportamiento que se utiliza fuera del lenguaje de Verse (a diferencia de los especificadores, que describen la semántica de Verse). Los atributos pueden añadirse en la línea de código anterior a las definiciones.
La sintaxis de los atributos utiliza el signo de arroba (@) seguido de la palabra clave.
| Atributo | Descripción | Ejemplo |
|---|---|---|
editable | Indica que este campo es una propiedad expuesta que se puede cambiar directamente desde UEFN, por lo que no hace falta modificar el código de Verse para cambiar su valor. Para obtener más información, consulta Cómo personalizar las propiedades de los dispositivos. | Verse |
editable_text_box | Una cadena editable que se muestra como un cuadro de texto en el editor. Actualmente, las cajas de texto editables no admiten burbujas informativas ni categorías. Para obtener más información, consulta Cómo personalizar las propiedades de los dispositivos. | Verse |
editable_slider | Un control deslizante editable que utiliza el tipo float. Puedes arrastrar el control deslizante en el editor para aumentar o disminuir el valor. Para obtener más información, consulta Cómo personalizar las propiedades de los dispositivos. | Verse |
editable_number | Un número editable con un mínimo y un máximo. Para obtener más información, consulta Cómo personalizar las propiedades de los dispositivos. | Verse |
editable_vector_slider | Un control deslizante vectorial editable. Puedes arrastrar para cambiar los valores de cada uno de los componentes del vector. Para obtener más información, consulta Cómo personalizar las propiedades de los dispositivos. | Verse |
editable_vector_number | Un número vectorial editable, que puede ser un vector2, un vector2i o un vector3. Para obtener más información, consulta Cómo personalizar las propiedades de los dispositivos. | Verse |
editable_container | Un contenedor editable de valores. Actualmente, solo admite matrices. Para obtener más información, consulta Cómo personalizar las propiedades de los dispositivos. | Verse |