In scripting, un blocco di codice è il corpo di una struttura di controllo o funzione. L'ambito di una variabile o funzione è il blocco di codice che può accedervi e può essere globale o locale. Tutti i blocchi possono accedere a variabili e funzioni globali. Un blocco può accedere a variabili e funzioni locali nel suo blocco padre, ma non in nessuno dei suoi blocchi figli.
Le variabili e le funzioni hanno ambito globale per default, ma è quasi sempre meglio dichiararle con ambito locale perché Luau accede a variabili e funzioni locali più velocemente di quelle globali. Per dare a una variabile o funzione ambito locale, metti la parola chiave local prima del suo nome quando la dichiari.
Gli script non possono accedere a variabili o funzioni globali e locali in altri script. Se desideri condividere valori e funzioni tra script, utilizza ModuleScripts.
local helloWorld = 'Hello World!'
local function printHelloWorld()
print(helloWorld)
end
printHelloWorld() -- Hello World!

- Il blocco B può accedere alla variabile locale nel blocco A.
- Il blocco C può accedere alle variabili e funzioni locali nei blocchi A e B.
- Il blocco A non può accedere alle variabili e funzioni locali nei blocchi B o C.
- Il blocco B non può accedere alla variabile locale nel blocco C.
Ambito globale
Dopo aver dichiarato una variabile o funzione globale, qualsiasi blocco di codice nello stesso script può accedervi. Le variabili e le funzioni hanno ambito globale a meno che non le dichiari con la parola chiave local.
Nel seguente codice, testVar ha ambito globale all'interno della funzione locale testFunc(). Quando Luau chiama testFunc(), assegna a testVar il valore 64. testVar ha ambito globale, quindi la funzione print() al di fuori di testFunc() può accedervi e stampare 64.
Esempio di funzioni e variabili globali
local function testFunc() -- ambito locale
testVar = 64 -- ambito globale
end
testFunc()
print(testVar) -- 64
Nel seguente codice, la variabile globale x inizia a 0, incrementa di 1 ad ogni iterazione del for loop, e stampa di nuovo dopo con un valore finale di 4.
x = 0 -- Variabile globale "x"for i = 1, 4 dox += 1print("Globale 'x' = " .. x)endprint("Globale 'x' = " .. x)--[[ Output risultante:Globale 'x' = 1Globale 'x' = 2Globale 'x' = 3Globale 'x' = 4Globale 'x' = 4]]
È più facile dichiarare variabili e funzioni globali perché non devi digitare tanto, ma le variabili e funzioni globali hanno i seguenti svantaggi rispetto a quelle locali:
- Luau accede a variabili e funzioni globali con una ricerca hash, quindi è costoso in termini di prestazioni. Usare una variabile globale in un ciclo critico per il tempo può farla funzionare più del 10% più lentamente rispetto all'uso di una variabile locale nello stesso ciclo.
- Luau elimina le variabili locali dopo che il loro ambito termina, riducendo l'uso della memoria.
Ambito locale
Luau può accedere a una variabile o funzione locale solo nel blocco di codice dove la dichiari. Creare una variabile con ambito locale ti dà un controllo più stretto su quando e dove il suo valore cambia.
Nel seguente codice, la funzione testFunc() e la variabile testVar hanno ambito locale. Solo il codice all'interno di testFunc() può accedere alla variabile testVar. La variabile testVar non ha un valore al di fuori di testFunc(), quindi chiamare print(testVar) all'interno di testFunc() stampa il valore di testVar, ma chiamare print(testVar) al di fuori di testFunc() stampa nil.
local function testFunc() -- ambito locale
local testVar = 64 -- ambito locale
print(testVar) -- 64
end
testFunc()
print(testVar) -- nil
Nel seguente codice, la variabile locale x ha valore 0 alla riga 1. Mentre Luau itererà attraverso il for loop, una diversa variabile locale x avrà valore 1. Poi, Luau stamperà la variabile iniziale x con un valore immutato di 0.
local x = 0 -- Variabile locale "x"for i = 1, 4 dolocal x = 1 -- Variabile "x" diversa, locale a questo "for" loopprint("Loop 'x' = " .. x)endprint("Iniziale 'x' = " .. x)--[[ Output risultante:Loop 'x' = 1Loop 'x' = 1Loop 'x' = 1Loop 'x' = 1Iniziale 'x' = 0]]
Cattura
Dopo aver dichiarato e assegnato una variabile locale, puoi leggerla nel suo livello di ambito e nelle funzioni il cui ambito è racchiuso dallo stesso ambito che contiene la variabile locale. Questa tecnica è nota come cattura.
Nel seguente codice, la funzione f cattura la variabile locale x. La variabile x in f() è un upvalue.
local x = 5
local function f()
print(x)
end
f() -- 5
print(x) -- 5
Ombra
Dopo aver dichiarato e assegnato una variabile locale, puoi leggerla nel suo livello di ambito e nei livelli di ambito discendenti. Se ridichiari e riassegni la variabile in un livello di ambito discendente, allora crei una nuova variabile locale con lo stesso nome ma un valore diverso dall'assegnazione più recente. La nuova variabile locale non influenza la variabile locale dell'assegnazione precedente. Questa tecnica, nota come omissione, ti aiuta a riutilizzare il nome di una variabile senza riutilizzarne il valore.
Nel seguente codice, Luau ombra la variabile x. La variabile x in f() è una variabile ombra.
local x = 5
local function f()
local x = 7
print(x)
end
f() -- 7
print(x) -- 5
Puoi anche ridichiara una variabile locale senza assegnarle un valore in modo da poter riassegnare la variabile sia nel suo livello di ambito che nei livelli di ambito discendenti. Ridichiara una variabile locale senza assegnarle un valore la impostano su nil.
Nel seguente codice, Luau ombra la variabile locale fruitName nella funzione getFruitByColor(). La funzione ridichiara fruitName come una nuova variabile ombra e imposta il suo valore su nil. La funzione ha un livello di ambito discendente, un for loop, che assegna un valore a fruitName. Dopo il ciclo for, la funzione restituisce la variabile ombra fruitName. Per tutto il tempo della funzione, fruitName è la stessa variabile locale che non sovrascrive la variabile locale fruitName iniziale.
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) -- Lemon
print(fruit .. ", non " .. fruitName) -- Lemon, non Chocolate