Escopo

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

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 do
x += 1
print("Global 'x' = " .. x)
end
print("Global 'x' = " .. x)
--[[ saídaresultante:
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 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.
  • 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 uma sombra.

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 do
local x = 1 -- Variável diferente "x", local para este loop "para"
print("Loop 'x' = " .. x)
end
print("Initial 'x' = " .. x)
--[[ saídaresultante:
Loop 'x' = 1
Loop 'x' = 1
Loop 'x' = 1
Loop 'x' = 1
Initial '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