Ambito

*Questo contenuto è tradotto usando AI (Beta) e potrebbe contenere errori. Per visualizzare questa pagina in inglese, clicca qui.

Nella scripting, un blocco di codice è il corpo di una struttura di controllo o di una funzione .Lo scope di una variabile o funzione è il blocco di codice che può accedervi, e può essere globale o locale .Tutti i blocchi possono accedere alle variabili e alle funzioni globali.Un blocco può accedere alle variabili e alle funzioni locali nel suo blocco padre, ma non in nessuno dei suoi blocchi figli.

Le variabili e le funzioni hanno per impostazione predefinita una portata globale, ma è quasi sempre meglio dichiararle con una portata locale perché Luau accede alle variabili e alle funzioni locali più rapidamente delle globali.Per dare una scala locale variabile o funzione, metti la parola chiave local prima del suo nome quando lo dichiari.

Gli script non possono accedere alle variabili e alle funzioni globali e locali in altri script.Se vuoi condividere valori e funzioni tra gli script, usa 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.

Scopo globale

Dopo aver dichiarato una variabile o funzione globale, qualsiasi blocco di codice nello stesso script può accedervi.Le variabili e le funzioni hanno una portata globale a meno che tu non le dichiari con la parola chiave local.

Nel seguente codice, testVar ha una portata globale all'interno della funzione locale testFunc().Quando Luau chiama il , assegna il valore .Il testVar ha una portata globale, quindi la funzione print() fuori testFunc() può accedervi e stampare 64 .

Example of global functions and variables

local function testFunc() -- scopo locale
testVar = 64 -- ambito globale
end
testFunc()
print(testVar) -- 64

Nel seguente codice, la variabile globale inizia a , aumenta di con ogni iterazione del ciclo , e stampa di nuovo in seguito con un valore finale di 4.


x = 0 -- Variabile globale "x"
for i = 1, 4 do
x += 1
print("Global 'x' = " .. x)
end
print("Global 'x' = " .. x)
--[[ Output risultante:
Global 'x' = 1
Global 'x' = 2
Global 'x' = 3
Global 'x' = 4
Global 'x' = 4
]]

È più facile dichiarare le variabili e le funzioni globali perché non devi digitare così tanto, ma le variabili e le funzioni globali hanno i seguenti svantaggi rispetto a quelle locali:

  • Luau accede alle variabili e alle funzioni globali con una ricerca di hash, quindi è costoso da utilizzare in termini di Prestazione.L'utilizzo di una variabile globale in un ciclo sensibile al tempo può renderlo più lento del 10% rispetto all'utilizzo di una variabile locale nello stesso ciclo.
  • Luau disposizione di variabili locali dopo la loro scadenza, riducendo l'utilizzo della memoria.
  • Puoi accedere a variabili e funzioni globali all'interno dello stesso script, ma non tra più script.Pertanto, una variabile o funzione globale non fornisce alcun vantaggio rispetto a un equivalente locale in scala, un upvalue o una ombra.

Scopo locale

Luau può accedere solo a una variabile o funzione locale nel blocco di codice in cui la dichiari.Creare una variabile con scopo locale ti dà un controllo più rigoroso su quando e dove il suo valore cambia.

Nel seguente codice, la funzione testFunc() e la variabile testVar hanno scopo locale.Solo il codice entro 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() -- scopo locale
local testVar = 64 -- scopo locale
print(testVar) -- 64
end
testFunc()
print(testVar) -- nil

Nel seguente codice, la variabile locale x ha il valore 0 alla linea 1.Mentre Luau itera attraverso il ciclo , una variabile locale diversa ha valore .Quindi, Luau stampa la variabile iniziale x con un valore non modificato 0 .


local x = 0 -- Variabile locale "x"
for i = 1, 4 do
local x = 1 -- Variabile diversa "x", locale a questo ciclo "for"
print("Loop 'x' = " .. x)
end
print("Initial 'x' = " .. x)
--[[ Output risultante:
Loop 'x' = 1
Loop 'x' = 1
Loop 'x' = 1
Loop 'x' = 1
Initial 'x' = 0
]]

Cattura

Dopo aver dichiarato e assegnato una variabile locale, puoi leggerla nel suo livello di scopo e nelle funzioni il cui ambito è chiuso dalla stessa scopo contenente 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

Ombre

Dopo aver dichiarato e assegnato una variabile locale, puoi leggerla nel suo livello di scopo e nei livelli di scopo descendenti.Se ri dichiari e riassegni la variabile in un Livellodi scopo discendente, crei una nuova variabile locale con lo stesso nome ma valore diverso dall'assegnazione più precedente.La nuova variabile locale non influisce sulla variabile locale dall'assegnazione precedente.Questa tecnica, nota come ombreggiamento , ti aiuta a riutilizzare il nome di una variabile senza riutilizzare il suo 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 ridichiarare una variabile locale senza assegnarle un valore in modo da poter riassegnare la variabile sia a livello di scopo che a livello di scopo descendente.Rideclare una variabile locale senza assegnarle un valore imposta il suo valore a nil .

Nel seguente codice, Luau ombra la variabile locale fruitName nella funzione getFruitByColor() .La funzione redeclares fruitName come nuova variabile ombra e imposta il suo valore a nil .La funzione ha un Livellodi scopo discendente, un for loop , che assegna un valore a fruitName.Dopo il ciclo while, la funzione restituisce la variabile ombra fruitName.Per tutta la funzione, fruitName è la stessa variabile locale che non sovrascrive la variabile locale iniziale 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) -- Limone
print(fruit .. ", not " .. fruitName) -- Lemon, not Chocolate