Na scripting, um bloco de código é o corpo de uma estrutura de controle ou função .O escopo da variável ou função é o bloco de código que pode acessá-la 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.
As variáveis e funções têm escopo global por padrão, mas quase sempre é melhor declará-las com escopo local porque o Luau acessa variáveis e funções locais mais rapidamente do que as globais.Para dar um escopo local a uma variável ou função, coloque a palavra-chave local antes do seu nome quando você declará-la.
Scripts não podem acessar variáveis globais e locais ou funções 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 em blocos A e B.
- O bloco A não pode acessar as variáveis e funções locais em blocos B ou C.
- O bloco B não pode acessar a variável local no bloco C.
Escopo global
Depois de declarar uma variável ou função global, qualquer bloco de código no mesmo script pode acessá-la.As variáveis e funções têm escopo global a menos que você as declare com a palavra-chave local.
No seguinte código, testVar tem escopo global dentro da função local 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() -- alcance local
testVar = 64 -- escopo global
end
testFunc()
print(testVar) -- 64
No seguinte código, a variável global começa em , aumenta em com cada iteração do loop , e imprime novamente mais tarde com um valor final de 4.
x = 0 -- Variável global "x"for i = 1, 4 dox += 1print("Global 'x' = " .. x)endprint("Global 'x' = " .. x)--[[ saídaresultante:Global 'x' = 1Global 'x' = 2Global 'x' = 3Global 'x' = 4Global 'x' = 4]]
É mais fácil declarar variáveis e funções globais porque você não precisa digitar tanto, 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 usar em termos de performance.Usar uma variável global em um ciclo crítico de tempo pode fazê-la executar mais de 10% mais lento do que usar uma variável local no mesmo ciclo.
- Luau disposiciona variáveis locais após seu escopo terminar, reduzindo o uso de memória.
Alcance local
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 seguinte código, a função testFunc() e a variável testVar têm escopo local.Apenas o código dentro de testFunc() pode acessar a variável testVar.A variável testVar 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() -- alcance local
local testVar = 64 -- alcance local
print(testVar) -- 64
end
testFunc()
print(testVar) -- nil
No seguinte código, a variável local x tem valor 0 na linha 1.Como o Luau itera através do loop , uma variável local diferente tem valor .Então, Luau imprime a variável inicial x com um valor não alterado 0 .
local x = 0 -- Variável local "x"for i = 1, 4 dolocal x = 1 -- Variável diferente "x", local para este loop "para"print("Loop 'x' = " .. x)endprint("Initial 'x' = " .. x)--[[ saídaresultante:Loop 'x' = 1Loop 'x' = 1Loop 'x' = 1Loop 'x' = 1Initial 'x' = 0]]
Capturar
Depois de declarar e atribuir uma variável local, você pode lê-la no nível de alcance e funções cujos alcances sejam contidos pelo mesmo alcance que contém a variável local.Esta técnica é conhecida como capturar .
No seguinte código, a função f captura a variável local x.A variável x em f() é um valor superior .
local x = 5
local function f()
print(x)
end
f() -- 5
print(x) -- 5
Trevas
Depois de declarar e atribuir uma variável local, você pode lê-la em seu nível de escopo e níveis de escopo descendente.Se você redefinir e reatribuir a variável em um nível de escopo descendente, então você cria uma nova variável local com o mesmo nome, mas de 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 sombreamento , ajuda você a reutilizar o nome de uma variável sem reutilizar seu valor.
No seguinte código, Luau sombra a variável . A variável em é uma variável sombra .
local x = 5
local function f()
local x = 7
print(x)
end
f() -- 7
print(x) -- 5
Você também pode redefinir uma variável local sem atribuir um valor a ela para que você possa reatribuir a variável em ambos os níveis de escopo e níveis de escopo descendente.Reclamar uma variável local sem atribuir um valor a ela define seu valor para nil .
No seguinte código, Luau sombra a variável local fruitName na função getFruitByColor().A função redefine fruitName como uma nova variável sombra e define seu valor para nil .A função tem um nível de escopo descendente, um loop , que atribui um valor a .Após o loop for, a função retorna a variável de sombra fruitName.Ao longo de toda a função, fruitName é a mesma variável local que não substitui 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