Escopo

*Este conteúdo é traduzido por IA (Beta) e pode conter erros. Para ver a página em inglês, clique aqui.

Em scripting, um bloco de código é o corpo de uma estrutura de controle ou função . O escopo de uma variável ou função é o bloco de código que pode acessá-lo, e pode ser global ou local . Todos os blocos podem acessar variáveis e funções globais. Um bloco pode acessar variáveis e funções locais em seu bloco pai, mas não em nenhum de seus blocos filhos.

Variáveis e funções têm escopo global por padrão, mas é quase sempre melhor declará-las com escopo local, pois o Luau acessa variáveis e funções locais mais rápido que as globais. Para dar um escopo local a uma variável ou função, coloque a palavra-chave local antes de seu nome quando a declarar.

Scripts não podem acessar variáveis ou funções globais e locais em outros scripts. Se você quiser compartilhar valores e funções entre scripts, use ModuleScripts .


local helloWorld = 'Hello World!'
local function printHelloWorld()
print(helloWorld)
end
printHelloWorld() -- Hello World!
  • O bloco B pode acessar a variável local no bloco A.
  • O bloco C pode acessar as variáveis e funções locais nos blocos A e B.
  • O bloco A não pode acessar as variáveis e funções locais nos blocos B ou C.
  • O bloco B não pode acessar a variável local no bloco C.

Âmbito Global

Depois de declarar uma variável ou função global, qualquer bloco de código no mesmo script pode acessá-lo. Variáveis e funções têm escopo global, a menos que você as declare com a palavra-chave local.

No código a seguir, testVar tem escopo global dentro da função testFunc(). Quando Luau chama o testFunc() , ele atribui testVar o valor 64 . O testVar tem escopo global, então a função print() fora de testFunc() pode acessá-la e imprimir 64 .

Example of global functions and variables

local function testFunc() -- escopo local
testVar = 64 -- escopo global
end
testFunc()
print(testVar) -- 64

No código a seguir, a variável global x começa em 0 , em incrementos de 1 com cada iteração do for loop , e imprime novamente depois com um valor final de 4.


x = 0 -- Variável global "x"
for i = 1, 4 do
x += 1
print("Global 'x' = " .. x)
end
print("Global 'x' = " .. x)
--[[ Resultante da saída:
Global 'x' = 1
Global 'x' = 2
Global 'x' = 3
Global 'x' = 4
Global 'x' = 4
]]

É mais fácil declarar variáveis e funções globais porque você não precisa digitar muito, mas variáveis e funções globais têm as seguintes desvantagens em comparação com as locais:

  • O Luau acessa variáveis e funções globais com uma busca de hash, então é caro de usar em termos de performance. Usar uma variável global em um loop crítico de tempo pode torná-la 10% mais lenta do que usar uma variável local no mesmo loop.
  • Luau elimina variáveis locais depois que seu escopo termina, reduzindo o uso de memória.
  • Você pode acessar variáveis e funções globais dentro do mesmo script, mas não entre vários scripts. Portanto, uma variável ou função global não fornece nenhum benefício sobre um equivalente local em escopo, um upvalue ou um shadow .

Escopo local

O Luau só pode acessar uma variável ou função local no bloco de código onde você a declara. Criar uma variável com escopo local dá a você um controle mais apertado sobre quando e onde seu valor muda.

No código a seguir, a função testFunc() e a variável testVar têm escopo local. Apenas o código dentro de testFunc() pode acessar a testVar variável. A testVar variável não tem um valor fora de testFunc(), então chamar print(testVar) dentro de testFunc() imprime o valor de testVar , mas chamar print(testVar) fora de testFunc() imprime nil.


local function testFunc() -- escopo local
local testVar = 64 -- escopo local
print(testVar) -- 64 vezes
end
testFunc()
print(testVar) -- nil

No código a seguir, a variável local x tem valor 0 na linha 1. À medida que Luau itera através do loop for, uma variável local diferente x tem valor 1. Então, Luau imprime a variável inicial x com um valor inalterado 0 .


local x = 0 -- Variável local "x"
for i = 1, 4 do
local x = 1 -- Variável diferente "x," local para este loop "para"
print("Loop 'x' = " .. x)
end
print("Initial 'x' = " .. x)
--[[ Resultante da saída:
Loop 'x' = 1
Loop 'x' = 1
Loop 'x' = 1
Loop 'x' = 1
Initial 'x' = 0
]]

Captação

Depois de declarar e atribuir uma variável local, você pode lê-la em seu nível de escopo e funções que são cercadas pelo mesmo escopo que contém a variável local. Essa técnica é conhecida como capturando .

No código a seguir, a função f captura a variável local x. A variável x em f() é um upvalue .


local x = 5
local function f()
print(x)
end
f() -- 5 vezes
print(x) -- 5

Sombrando

Depois de declarar e atribuir uma variável local, você pode lê-la em seu nível de escopo e nos níveis de escopo descendente. Se você voltar a declarar e atribuir a variável em um nível de escopo descendente, você criará uma nova variável local com o mesmo nome, mas um valor diferente da atribuição mais anterior. A nova variável local não afeta a variável local da atribuição anterior. Essa técnica, conhecida como shadowing , ajuda você a reutilizar o nome de uma variável sem reutilizar seu valor.

No código a seguir, Luau sombreia a variável x. A variável x em f() é uma sombra .


local x = 5
local function f()
local x = 7
print(x)
end
f() -- 7 vezes
print(x) -- 5

Você também pode redeclarar uma variável local sem atribuir um valor a ela, para que você possa reatribuir a variável em seu nível de escopo e nos níveis de escopo descendente. Redeclarar uma variável local sem atribuir um valor a ela define seu valor para nil .

No código a seguir, Luau sombreia a variável local fruitName na função getFruitByColor() . A função redefine fruitName como uma nova variável de sombra e define seu valor como nil . A função tem um nível de escopo descendente, um for loop , que atribui um valor a fruitName . Após o loop for, a função retorna a fruitName variável de sombra. Ao longo de toda a função, fruitName é a mesma variável local que não sobrescreve a variável local inicial fruitName.


local fruitName = "Chocolate"
local fruitTable = {
Lemon = "Yellow",
Apple = "Red",
Orange = "Orange"
}
local function getFruitByColor(color)
local fruitName
for key, value in fruitTable do
if value == color then
fruitName = key
end
end
return fruitName
end
local fruit = getFruitByColor("Yellow")
print(fruit) -- Limão
print(fruit .. ", not " .. fruitName) -- Lemon, not Chocolate