Los especificadores en Verse describen el comportamiento en relación con la semántica y pueden añadir especificadores a los identificadores y a determinadas palabras clave. La sintaxis del especificador utiliza paréntesis angulares (< y >) con la palabra clave en el medio. Por ejemplo, en IsPuzzleSolved()<decides><transacts>:void, se especifican "decides" y "transacts".
En Verse, los atributos describen el comportamiento que se usa fuera del lenguaje Verse (a diferencia de los especificadores, que describen la semántica de Verse). La sintaxis de los atributos utiliza el signo dearroba (@) seguido de la palabra clave, por ejemplo, @editable.
En las siguientes secciones, se describen todos los especificadores y los atributos en Verse y cuándo puedes usarlos.
Especificadores de efecto
Los efectos en Verse indican categorías de comportamiento que puede mostrar una función. Puedes añadir especificadores de efecto a:
Después de
()en una definición de función:name()<specifier>:type = codeblock.La palabra clave
clase: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 el método se llama en un contexto de error que falla, los efectos se deshacen. |
|
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 el método se llama en un contexto de error que falla, los efectos se deshacen. |
|
computes | Un método |
|
converges | Este efecto garantiza que no solo no haya efectos secundarios de la ejecución de la función relacionada sino que la función se complete (no se repite infinitamente). Este efecto solo puede aparecer en funciones que tengan el especificador nativo, pero el compilador no lo comprueba. El código que brinda valores predeterminados de clase de campo o valores de 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. Debido a que 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. Es mutuamente excluyente con el efecto |
|
En todos los casos, llamar a una función que tiene un efecto específico requerirá que también el llamador tenga 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
varpara un miembro:var<specifier> name : type = value
Puedes tener un especificador de acceso tanto en el identificador como en la palabra clave var para 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 el subtipo actuales puedan escribir en la variable.
var<protected> MyInteger<public>:int = 2| Especificador | Descripción | Uso | Ejemplo |
|---|---|---|---|
public | El identificador es accesible universalmente. | Puedes usar el especificador en:
| Verse |
protected | Solo la clase actual y cualquier subtipo pueden acceder al identificador. | Puedes usar el especificador en:
| Verse |
private | Solo se puede acceder al identificador en el ámbito actual inmediatamente incluido (ya sea un módulo, clase, estructura, etc.). | Puedes usar el especificador en:
| Verse |
internal | Solo se puede acceder al identificador en el módulo actual inmediatamente incluido. Este es el nivel de acceso predeterminado. | Puedes usar el especificador en:
| Verse |
scoped | Solo se puede acceder al identificador en el ámbito actual y en cualquier ámbito que lo incluya. Cualquier recurso que expongas a Verse y que aparezca en el archivo Assets.digest.Verse tendrá el especificador | Puedes usar el especificador en:
| Verse |
Especificadores de clase
Los especificadores de clase definen determinadas características de las clases o sus miembros, como, por ejemplo, si se puede crear una subclase de una clase.
| Especificador | Descripción | Ejemplo |
|---|---|---|
abstract | Cuando una clase o un método de clase tiene el especificador | Verse |
castable | Indica que este tipo se puede convertir dinámicamente. El especificador El tipo | Verse |
concrete | Cuando una clase tiene el especificador | Verse |
unique | En Verse, a una clase unique se le asigna una identidad unique para cada instancia. Esto significa que, incluso si dos instancias de la misma clase unique tienen los mismos valores de campo, no son iguales, ya que son instancias distintas. Esto permite comparar la igualdad de las instancias de clases únicas mediante la comparación de sus identidades. Las clases sin el identificador unique no tienen dicha identidad y su igualdad solo pueden compararse con base en los valores de sus campos. Esto significa que las clases únicas pueden compararse con los operadores = y <> y son subtipos del tipo comparable. | Verse |
final | Solo puedes usar el especificador
| Verse |
final_super | El especificador Esto es necesario 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 usarlo en tus variables weak_map del módulo y hacer que sus valores persistan en las sesiones de juego. Para obtener más información sobre la persistencia en Verse, consulta Cómo usar datos persistentes en Verse.
Puedes usar el especificador persistente 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 del enum una vez que se publica la isla.
Puedes usar los especificadores open y closed con los siguientes tipos. Sigue los enlaces para obtener más información.
| Especificador | Descripción | Ejemplo |
|---|---|---|
Abrir | Un especificador que actualmente solo se aplica a las enumeraciones. Puedes agregar o reordenar valores de enum en una enum abierta, o cambiarla a una <closed> enum. Las enumeraciones abiertas se utilizan mejor cuando se espera que la cantidad de valores en su enum aumente en el futuro. Por ejemplo, un enum de tipos de armas. | Verse |
Cerrado | Un especificador que actualmente solo se aplica a las enumeraciones. Las enumeraciones se cierran de forma predeterminada. Las enumeraciones cerradas se utilizan mejor para 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 usar especificadores de implementación al escribir código, pero los verás en las API de UEFN.
| Especificador | Descripción | Ejemplo |
|---|---|---|
native | Indica que la información de definición del elemento se implementa 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 que otro código de C++ puede llamarlo. Puedes ver este especificador usado en un método de instancia. Este especificador no se propaga a subclases por lo que no es necesario que lo añadas a una definición cuando anules el método que tiene este especificador. | Verse |
Atributos
En Verse, los atributos describen el comportamiento que se usa fuera del lenguaje 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 antes de 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 es necesario modificar el código de Verse para cambiar su valor. Para obtener más información, consulta Personaliza las propiedades del dispositivo. | Verse |
editable_text_box | Una cadena editable que se muestra como un cuadro de texto en el editor. Los cuadros de texto editables actualmente no admiten información sobre herramientas ni categorías. Para obtener más información, consulta Personaliza las propiedades del dispositivo. | 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 Personaliza las propiedades del dispositivo. | Verse |
editable_number | Un número editable con un mínimo y un máximo. Para obtener más información, consulta Personaliza las propiedades del dispositivo. | 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 Personaliza las propiedades del dispositivo. | Verse |
editable_vector_number | Un número de vector editable, que puede ser vector2, vector2i o vector3. Para obtener más información, consulta Personaliza las propiedades del dispositivo. | Verse |
editable_container | Un contenedor editable de valores. Actualmente, esto solo admite matrices. Para obtener más información, consulta Personaliza las propiedades del dispositivo. | Verse |