Scope
Um escopo é como um dicionário com entradas dentro, onde as chaves possuem valores.
Definição
Escopos são definidos com chaves {}
, como no exemplo a seguir:
meuEscopoBacana = {
lugar = 'aqui'
quando = 'agora'
}
Escopos armazenam entradas em ordem alfabética. Isso se torna evidente quando você mapeia um escopo.
Acesso
Existem três maneiras de acessar diretamente as entradas dentro de um escopo.
Sintaxe de ponto
meuEscopoBacana.lugar # retorna: 'aqui'
Sintaxe de obtenção
# assumindo que prop = 'lugar'
meuEscopoBacana(prop) # retorna: 'aqui'
De qualquer maneira, se a propriedade não estiver presente, null
será retornado. E se o escopo externo não for encontrado no escopo, um erro será gerado.
Sintaxe de encadeamento opcional
Você pode encadear o escopo externo ausente usando o operador interrogação-ponto ?.
:
naoExistente?.propriedade # null
O encadeamento opcional não gera um erro quando o escopo externo é null
.
Operações
==
igual!=
diferente+
adição (efeito de mesclagem)-
subtração (efeito de diferença)&
AND lógico|
OR lógico
logical AND/OR evaluate empty scopes as
false
, otherwisetrue
AND/OR lógicos avaliam escopos vazios como
false
, caso contráriotrue
Adição de escopo (mesclagem)
O segundo operando funciona como se fosse um patch para o primeiro operando:
x = { a = 1, b = 3 }
y = { b = 2 }
x + y # { a = 1, b = 2 }
y + x # { a = 1, b = 3 }
valores do segundo operando substituem valores do primeiro operando
Subtração de escopo (diferença)
A operação de subtração, gera a remoção dos elementos do segundo operando que também estão presentes no primeiro operando:
x = { a = 1, b = 3 }
y = { a = 1 }
x - y # { b = 3 }
apenas valores exatamente idênticos são removidos