En los scripting, un bloque de código es el cuerpo de una estructura de control o función . El alcance de una variable o función es el bloque de código que puede acceder a ella, y puede ser global o 1>local1> . Todos los bloques pueden acceder a las variables y funciones globales. Un bloque puede acceder a las funciones y bloques local
Las variables y las funciones tienen un alcance global por defecto, pero es casi siempre mejor declararlas con un alcance local porque Luau accede a las variables y las funciones locales más rápido que las globales. Para dar un alcance local a una variable o función, ponga la palabra clave local antes de su nombre cuando lo declare.
Los scripts no pueden acceder a variables globales y locales o funciones en otros scripts. Si desea compartir valores y funciones entre los scripts, use ModuleScripts .
local helloWorld = 'Hello World!'
local function printHelloWorld()
print(helloWorld)
end
printHelloWorld() -- Hello World!
- El bloque B puede acceder a la variable local en el bloque A.
- Bloque C puede acceder a las variables y funciones locales en bloques A y B.
- Block A no puede acceder a las variables y funciones locales en bloques B o C.
- El bloque B no puede acceder a la variable local en el bloque C.
Alcance Global
Después de declarar una variable global o función, cualquier bloque de código en el mismo script puede acceder a él. Las variables y las funciones tienen un alcance global a menos que las declare con la palabra clave local.
En el siguiente código, testVar tiene un alcance global dentro de la función local testFunc(). Cuando Luau llama a la función testFunc(), asigna el valor 1> 641> .
Example of global functions and variables
local function testFunc() -- mira local
testVar = 64 -- alcance global
end
testFunc()
print(testVar) -- 64
En el siguiente código, la variable global x comienza en 0 , incrementa por 1 con cada itación de la 1>2> for2> bucle, y se imprime nuevamente después con un valor final de 4.
x = 0 -- Variable global "x"for i = 1, 4 dox += 1print("Global 'x' = " .. x)endprint("Global 'x' = " .. x)--[[ Resultado de Salida:Global 'x' = 1Global 'x' = 2Global 'x' = 3Global 'x' = 4Global 'x' = 4]]
Es más fácil declarar variables globales y funciones porque no necesitas escribir tanto, pero las variables globales y las funciones tienen los siguientes desventajas en comparación con las locales:
- Luau accede a variables y funciones globales con una búsqueda de hashes, por lo que es costoso de usar en términos de ejecución. Usar una variable global en un ciclo de tiempo crítico puede hacer que funcione más lento que usar una variable local en el mismo ciclo.
- Luau desplaza variables locales después de que termine su alcance, lo que reduce el uso de memoria.
- Puede acceder a variables y funciones globales dentro del mismo script, pero no entre múltiples scripts. Por lo tanto, una variable global o función no proporciona ningún beneficio sobre un equivalente local en el rango, un upvalue o un shadow .
Mira local
Luau solo puede acceder a una variable o función local en el bloque de código en el que la declaras. Crear una variable con alcance local te da un control más estricto sobre cuándo y dónde cambia su valor.
En el siguiente código, la función testFunc() y la variable
local function testFunc() -- mira local
local testVar = 64 -- mira local
print(testVar) -- 64
end
testFunc()
print(testVar) -- nil
En el siguiente código, la variable local x tiene el valor 0 en la línea 1. Cuando Luau itera a través de la for loop , una variable local diferente 3> x3> tiene el valor 6>
local x = 0 -- Variable local "x"for i = 1, 4 dolocal x = 1 -- Diferentes variables "x", local para este "para" cicloprint("Loop 'x' = " .. x)endprint("Initial 'x' = " .. x)--[[ Resultado de Salida:Loop 'x' = 1Loop 'x' = 1Loop 'x' = 1Loop 'x' = 1Initial 'x' = 0]]
Capturando
Después de declarar y asignar una variable local, puede leerla en su nivel de alcance y funciones cuyos alcances están incluidos por el mismo alcance que contiene la variable local. Esta técnica se conoce como capturar .
En el siguiente código, la función f captura la variable local x . La variable x en 1> f()1> es un 4> upvalue4> .
local x = 5
local function f()
print(x)
end
f() -- 5
print(x) -- 5
Sombreado
Después de declarar y asignar una variable local, puede leerla en su nivel de alcance y niveles de alcance descendientes. Si redeclara y reasigna la variable en un nivel de alcance descendente, entonces crea una nueva variable local con el mismo nombre pero diferente valor de la asignación más antigua. La nueva variable local no afecta la variable local de la asignación anterior. Esta técnica, conocida como sombreado, ayuda a reutilizar el nombre de una variable sin reutil
En el siguiente código, Luau sombra la variable x . La variable x en f() es una variable de sombra.
local x = 5
local function f()
local x = 7
print(x)
end
f() -- 7
print(x) -- 5
También puede re declarar una variable local sin asignarle un valor para que pueda reasignar la variable en ambos sus niveles de alcance y niveles de alcance descendientes. Redefinir una variable local sin asignarle un valor establece su valor en nil .
En el siguiente código, Luau sombreada la variable local
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ón
print(fruit .. ", not " .. fruitName) -- Lemon, not Chocolate