No 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á-la, e ela pode ser 1> global1> ou 4>local4>. Todos os blocos podem acessar variáveis glob
Variáveis e funções têm alcance global por padrão, mas é quase sempre melhor declará-las com alcance local, pois o acesso a variáveis e funções globais é mais rápido. Para dar um alcance local a uma variável ou função, coloque a palavra-chave local antes de seu nome quando você a declara.
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!
- 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.
- Bloco B não pode acessar a variável local em Bloco C.
Alcance Global
Depois de você 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 alcance global a menos que você as declare com a palavra-chave local.
No seguinte código, testVar tem alcance global dentro da função local testFunc(). Quando Luau chamar a função testFunc(), ele atribui o valor 1> 641> ao <
Example of global functions and variables
local function testFunc() -- mira local
testVar = 64 -- alcance global
end
testFunc()
print(testVar) -- 64
No seguinte código, a variável global x começa em 0 , incrementa por 1 com cada iteração do 1>2> for2> loop, e imprime novamente posteriormente 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)--[[ Resultado da saída:Global 'x' = 1Global 'x' = 2Global 'x' = 3Global 'x' = 4Global 'x' = 4]]
É mais fácil declarar variáveis globais e funções, pois você não precisa digitar tanto, mas variáveis globais e funções têm os seguintes desvantagens em comparação com as variáveis locais:
- O acesso Luau a variáveis globais e funções com uma pesquisa de hashes, então é caro usar em termos de performance. Usar uma variável global em um loop de tempo crítico pode fazer com que ela execute mais de 10% mais lentamente do que usar uma variável local no mesmo loop.
- Luau descarta variáveis locais após o término de seu alcance, reduzindo o uso de memória.
- Você pode acessar variáveis globais e funções dentro do mesmo script, mas não entre múltiplos scripts. Portanto, uma variável global ou função não fornece nenhum benefício sobre um equivalente local, um upvalue ou um shadow.
Mira 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 alcance local dá a você controle mais rígido sobre quando e onde sua valor muda.
No seguinte código, a função testFunc() e a variável <
local function testFunc() -- mira local
local testVar = 64 -- mira local
print(testVar) -- 64
end
testFunc()
print(testVar) -- nil
No seguinte código, a variável local x tem o valor 0 na linha 1. Como Luau itera através do loop for , uma variável local diferente 1> x1> tem o valor 4> 14>
local x = 0 -- Variável local "x"for i = 1, 4 dolocal x = 1 -- Diferentes variáveis "x", locais para este "para" loopprint("Loop 'x' = " .. x)endprint("Initial 'x' = " .. x)--[[ Resultado da saída:Loop 'x' = 1Loop 'x' = 1Loop 'x' = 1Loop 'x' = 1Initial 'x' = 0]]
Capturando
Depois de declarar e atribuir uma variável local, você pode lê-la em seu nível de alcance e funções cujos escopos são fechados pela mesma escopo 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 no seguinte 1> f1> é um 4> upvalue4>.
local x = 5
local function f()
print(x)
end
f() -- 5
print(x) -- 5
Sombreamento
Depois de declarar e atribuir uma variável local, você pode lê-la em seu nível de alcance e níveis de alcance descendentes. Se você redefinir e reatribuir a variável em um nível de alcance descendente, então você cria uma nova variável local com o mesmo nome, mas diferente valor da mais recente atribuição. A nova variável local não afeta a variação local da atribuição anterior. Esta t
No seguinte código, Luau sombra a variável x. A variável x em f() é uma variável 1> sombra1>.
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 redefinir a variável em ambos os níveis de alcance e níveis de alcance descendentes. Redefinir uma variável local sem atribuir um valor a ela definirá seu valor em nil .
No seguinte código, Luau sombra a variá
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