Em Verse, os Especificadores descrevem o comportamento relacionado à semântica e podem adicionar especificadores a identificadores e determinadas palavras-chave. A sintaxe do especificador usa colchetes angulares (< e >, com a palavra-chave no meio. Por exemplo, em IsPuzzleSolved()<decides><transacts>:void, "decides" and "transacts" são especificadores.
Atributos em Verse descrevem o comportamento que é usado fora da linguagem Verse (ao contrário dos especificadores, que descrevem a semântica em Verse). A sintaxe do atributo usa o sinal de arroba (@) seguido da palavra-chave, por exemplo: @editable.
As seções a seguir descrevem todos os especificadores e atributos disponíveis no Verse e quando você pode usá-los.
Especificadores de efeito
Os efeitos em Verse indicam categorias de comportamento que uma função pode exibir. Você pode adicionar especificadores de efeito:
Depois do
()na definição de uma função:name()<specifier>:type = codeblock.A palavra-chave
class:name := class<specifier>(){}.
| Especificador | Descrição | Exemplo |
|---|---|---|
no_rollback | Esse é o efeito padrão quando nenhum efeito exclusivo é especificado. O efeito |
|
transacts | O efeito |
|
allocates | Esse efeito indica que a função pode instanciar um objeto na memória. Se o método for chamado em um contexto de falha que fracassa, os efeitos serão cancelados. |
|
reads | Um método com esse efeito pode ler o estado mutável. |
|
writes | Um método com este efeito pode gravar em estado mutável. Se o método for chamado em um contexto de falha que fracassa, os efeitos serão cancelados. |
|
computes | Um método |
|
converges | Além de garantir que não haja efeito colateral da execução da função relacionada, esse efeito também assegura que a função seja concluída (não recursiva infinitamente). Esse efeito só pode aparecer em funções que tenham o especificador native, mas isso não é verificado pelo compilador. Um código que forneça valores padrão de campos de classe ou valores para variáveis globais é necessário para ter esse efeito. |
|
decides | Esse efeito indica que a função pode falhar e que a chamada dessa função é uma expressão falível. Como o chamado da função |
|
suspends | Esse efeito indica que a função é assíncrona. Cria um contexto assíncrono para o corpo da função. Mutualmente exclusiva com o efeito |
|
Em todos os casos, chamar uma função que tenha um efeito específico exigirá que o chamador também tenha esse efeito.
Especificadores de acesso
Especificadores de acesso definem o que pode interagir com um membro e como. Você pode aplicar especificadores de acesso ao seguinte:
O identificador de um membro:
name<specifier> : type = valueA palavra-chave
varde um membro:var<specifier> name : type = value
Você pode ter um especificador de acesso tanto no identificador quanto na palavra-chave var de uma variável, para diferenciar entre quem tem acesso para ler e gravar a variável. Por exemplo, a variável a seguir MyInteger tem o especificador público no identificador para que qualquer pessoa possa ler o valor, mas a palavra-chave var tem o especificador protegido, para que somente a classe atual e os subtipos possam gravar na variável.
var<protected> MyInteger<public>:int = 2| Especificador | Descrição | Uso | Exemplo |
|---|---|---|---|
public | O identificador é universalmente acessível. | Você pode usar esse especificador em:
| Verse |
protected | O identificador só pode ser acessado pela classe atual e quaisquer subtipos. | Você pode usar esse especificador em:
| Verse |
private | O identificador só pode ser acessado no escopo atual imediatamente circundante (seja um módulo, classe, struct etc.). | Você pode usar esse especificador em:
| Verse |
internal | O identificador só pode ser acessado no módulo imediatamente circundante atual. Este é o nível de acesso padrão. | Você pode usar esse especificador em:
| Verse |
scoped | O identificador só pode ser acessado no escopo atual e em qualquer escopo adjacente. Todos os recursos que você expor ao Verse e que aparecerem no arquivo Assets.digest.Verse terão o especificador | Você pode usar esse especificador em:
| Verse |
Especificadores de classe
Especificadores de classe definem certas características de classes ou de seus membros (por exemplo, se você pode criar uma subclasse de uma classe).
| Especificador | Descrição | Exemplo |
|---|---|---|
abstract | Quando uma classe ou um método de classe tem o especificador | Verse |
castable | Indica que esse tipo pode ser convertido dinamicamente. O especificador O tipo | Verse |
concrete | Quando uma classe tiver o especificador | Verse |
unique | Uma classe unique no Verse recebe uma identidade unique para cada instância. Isso significa que, mesmo que duas instâncias da mesma classe unique tenham os mesmos valores de campo, elas não serão iguais, pois são instâncias distintas. Assim, é possível comparar instâncias de classes exclusivas em termos de igualdade ao comparar suas identidades. Classes sem o especificador unique não têm essa identidade, por isso só podem ser comparadas em termos de igualdade baseadas nos valores dos seus campos. Isso significa que classes exclusivas podem ser comparadas com os operadores = e <> e são subtipos do tipo comparável. | Verse |
final | Você pode usar o especificador
| Verse |
final_super | O especificador Isso é necessário no Scene Graph para subtipos imediatos de | Verse |
Especificador "persistence"
Quando um tipo personalizado, como uma classe, tem o especificador <persistable>, você pode usá-lo nas variáveis weak_map com escopo de módulo e fazer com que seus valores persistam entre as sessões de jogo. Para obter mais detalhes sobre a persistência em Verse, consulte Como usar dados persistentes em Verse.
Você pode usar o especificador de persistência com os seguintes tipos: Siga os links para obter mais detalhes.
Especificadores aberto e fechado
Atualmente utilizável apenas com enumerações. Os especificadores <open> e <closed> determinam como você pode alterar a definição da enumeração depois que sua ilha for publicada.
Você pode usar os especificadores aberto e fechado com os seguintes tipos. Siga os links para obter mais detalhes.
| Especificador | Descrição | Exemplo |
|---|---|---|
Aberto | Um especificador que atualmente se aplica apenas a enumerações. Você pode adicionar ou reordenar valores de enumeração em uma enumeração aberta ou alterá-la para uma enumeração <closed>. Enumerações abertas são melhores quando se espera que o número de valores na enumeração possa aumentar no futuro. Por exemplo, uma enumeração de tipos de armas. | Verse |
Fechadas | Um especificador que atualmente se aplica apenas a enumerações. As enumerações são fechadas por padrão. Enumerações fechadas são mais eficientes para casos em que se espera que seus valores permaneçam os mesmos, como dias da semana. | Verse |
Especificadores de implementação
Não é possível usar especificadores de implementação ao criar código, mas você os verá ao analisar as APIs do UEFN.
| Especificador | Descrição | Exemplo |
|---|---|---|
native | Indica que os detalhes da definição do elemento são implementados em C++. As definições Verse com o especificador
| Verse |
native_callable | Indica que um método de instância é nativo (implementado em C++) e pode ser chamado por outro código C++. É possível ver esse especificador usado em um método de instância. Esse especificador não se propaga para subclasses e, portanto, não é necessário adicioná-lo a uma definição ao substituir um método que tenha esse especificador. | Verse |
Atributos
Atributos em Verse descrevem o comportamento que é usado fora da linguagem Verse (ao contrário de especificadores, que descrevem a semântica em Verse). Atributos podem ser adicionados na linha de código antes de definições.
A sintaxe do atributo usa o sinal de arroba (@) seguido pela palavra-chave.
| Atributo | Descrição | Exemplo |
|---|---|---|
editable | Indica que esse campo é uma propriedade exposta que pode ser alterada diretamente no UEFN, de modo que você não precise modificar o código Verse para modificar seu valor. Para obter mais detalhes, consulte Como personalizar propriedades de dispositivos. | Verse |
editable_text_box | Uma string editável exibida como uma caixa de texto no editor. Caixas de texto editáveis atualmente não oferecem suporte para dicas de ferramentas ou categorias. Para obter mais detalhes, consulte Como personalizar propriedades de dispositivos. | Verse |
editable_slider | Um controle deslizante editável que usa o tipo "float". Você pode arrastar o controle deslizante no editor para aumentar ou diminuir o valor. Para obter mais detalhes, consulte Como personalizar propriedades de dispositivos. | Verse |
editable_number | Um número editável com mínimo e máximo. Para obter mais detalhes, consulte Como personalizar propriedades de dispositivos. | Verse |
editable_vector_slider | Um controle deslizante vetorial editável. Você pode arrastar para alterar os valores de cada um dos componentes do vetor. Para obter mais detalhes, consulte Como personalizar propriedades de dispositivos. | Verse |
editable_vector_number | Um número vetorial editável, que pode ser vector2, vector2i ou vector3. Para obter mais detalhes, consulte Como personalizar propriedades de dispositivos. | Verse |
editable_container | Um contêiner editável de valores. Atualmente, isso só é compatível com matrizes. Para obter mais detalhes, consulte Como personalizar propriedades de dispositivos. | Verse |