W skryptach blok kodu to ciało struktury kontrolnej lub funkcji. Zakres zmiennej lub funkcji to blok kodu, który może uzyskać do niej dostęp, i może być globalny lub lokalny. Wszystkie bloki mogą uzyskać dostęp do globalnych zmiennych i funkcji. Blok może uzyskać dostęp do lokalnych zmiennych i funkcji w swoim bloku nadrzędnym, ale nie w żadnym z jego bloków podrzędnych.
Zmiennie i funkcje domyślnie mają zakres globalny, ale prawie zawsze lepiej jest deklarować je z zakresem lokalnym, ponieważ Luau uzyskuje dostęp do lokalnych zmiennych i funkcji szybciej niż do globalnych. Aby nadać zmiennej lub funkcji lokalny zakres, umieść słowo kluczowe local przed jej nazwą podczas jej deklaracji.
Skrypty nie mogą uzyskiwać dostępu do globalnych i lokalnych zmiennych ani funkcji w innych skryptach. Jeśli chcesz dzielić się wartościami i funkcjami między skryptami, użyj ModuleScripts.
local helloWorld = 'Hello World!'
local function printHelloWorld()
print(helloWorld)
end
printHelloWorld() -- Hello World!

- Blok B może uzyskać dostęp do lokalnej zmiennej w bloku A.
- Blok C może uzyskać dostęp do lokalnych zmiennych i funkcji w blokach A i B.
- Blok A nie może uzyskać dostępu do lokalnych zmiennych i funkcji w blokach B lub C.
- Blok B nie może uzyskać dostępu do lokalnej zmiennej w bloku C.
Zakres globalny
Po zadeklarowaniu globalnej zmiennej lub funkcji każdy blok kodu w tym samym skrypcie może uzyskać do niej dostęp. Zmienne i funkcje mają zakres globalny, chyba że zadeklarujesz je ze słowem kluczowym local.
W poniższym kodzie, testVar ma zakres globalny w lokalnej funkcji testFunc(). Gdy Luau wywołuje testFunc(), przypisuje testVar wartość 64. testVar ma zakres globalny, więc funkcja print() poza testFunc() może uzyskać do niej dostęp i wydrukować 64.
Przykład globalnych funkcji i zmiennych
local function testFunc() -- lokalny zakres
testVar = 64 -- globalny zakres
end
testFunc()
print(testVar) -- 64
W poniższym kodzie, globalna zmienna x zaczyna się od 0, zwiększa się o 1 w każdej iteracji pętli for i następnie jest ponownie drukowana z wartością końcową 4.
x = 0 -- Globalna zmienna "x"for i = 1, 4 dox += 1print("Global 'x' = " .. x)endprint("Global 'x' = " .. x)--[[ Wynik:Global 'x' = 1Global 'x' = 2Global 'x' = 3Global 'x' = 4Global 'x' = 4]]
Łatwiej jest deklarować globalne zmienne i funkcje, ponieważ nie musisz tyle pisać, ale globalne zmienne i funkcje mają następujące wady w porównaniu do lokalnych:
- Luau uzyskuje dostęp do globalnych zmiennych i funkcji za pomocą wyszukiwania w tabeli, co jest kosztowne pod względem wydajności. Użycie zmiennej globalnej w pętli krytycznej pod względem czasu może sprawić, że będzie ona działać o więcej niż 10% wolniej niż użycie zmiennej lokalnej w tej samej pętli.
- Luau zwalnia lokalne zmienne po zakończeniu ich zakresu, co zmniejsza zużycie pamięci.
Zakres lokalny
Luau może uzyskać dostęp tylko do lokalnej zmiennej lub funkcji w bloku kodu, w którym ją zadeklarujesz. Utworzenie zmiennej z lokalnym zakresem daje ci większą kontrolę nad tym, kiedy i gdzie jej wartość się zmienia.
W poniższym kodzie, funkcja testFunc() i zmienna testVar mają lokalny zakres. Tylko kod wewnątrz testFunc() może uzyskać dostęp do zmiennej testVar. Zmienna testVar nie ma wartości poza testFunc(), więc wywołanie print(testVar) w testFunc() drukuje wartość testVar, ale wywołanie print(testVar) poza testFunc() drukuje nil.
local function testFunc() -- lokalny zakres
local testVar = 64 -- lokalny zakres
print(testVar) -- 64
end
testFunc()
print(testVar) -- nil
W poniższym kodzie, lokalna zmienna x ma wartość 0 w linii 1. Gdy Luau iteruje przez pętlę for, inna lokalna zmienna x ma wartość 1. Następnie Luau drukuje początkową zmienną x z niezmienioną wartością 0.
local x = 0 -- Lokalna zmienna "x"for i = 1, 4 dolocal x = 1 -- Inna zmienna "x", lokalna dla tej "pętli for"print("Pętla 'x' = " .. x)endprint("Początkowa 'x' = " .. x)--[[ Wynik:Pętla 'x' = 1Pętla 'x' = 1Pętla 'x' = 1Pętla 'x' = 1Początkowa 'x' = 0]]
Przechwytywanie
Po zadeklarowaniu i przypisaniu lokalnej zmiennej możesz ją odczytać w swoim poziomie zakresu oraz w funkcjach, których zakresy są zawarte w tym samym zakresie, w którym znajduje się lokalna zmienna. Technika ta jest znana jako przechwytywanie.
W poniższym kodzie funkcja f przechwytuje lokalną zmienną x. Zmienna x w f() jest upvalue.
local x = 5
local function f()
print(x)
end
f() -- 5
print(x) -- 5
Cień
Po zadeklarowaniu i przypisaniu lokalnej zmiennej możesz ją odczytać w swoim poziomie zakresu oraz w poziomach zakresu potomnych. Jeśli ponownie zadeklarujesz i przypiszesz zmienną w poziomie zakresu potomnego, stworzysz nową lokalną zmienną o tej samej nazwie, ale inną wartością niż przy najnowszym przypisaniu. Nowa lokalna zmienna nie wpływa na lokalną zmienną z poprzedniego przypisania. Ta technika, znana jako cieniowanie, pomaga ponownie wykorzystać nazwę zmiennej bez ponownego używania jej wartości.
W poniższym kodzie Luau cieniuje zmienną x. Zmienna x w f() jest zmienną cienia.
local x = 5
local function f()
local x = 7
print(x)
end
f() -- 7
print(x) -- 5
Możesz również ponownie zadeklarować lokalną zmienną bez przypisywania wartości, aby móc przypisać wartość do zmiennej zarówno w jej poziomie zakresu, jak i w poziomach zakresu potomnych. Ponowne zadeklarowanie lokalnej zmiennej bez przypisywania wartości ustawia jej wartość na nil.
W poniższym kodzie Luau cieniują lokalną zmienną fruitName w funkcji getFruitByColor(). Funkcja ponownie deklaruje fruitName jako nową zmienną cienia i ustawia jej wartość na nil. Funkcja ma poziom zakresu potomnego, pętlę for, która przypisuje wartość do fruitName. Po zakończeniu pętli funkcja zwraca zmienną cienia fruitName. W całej funkcji fruitName jest tą samą lokalną zmienną, która nie nadpisuje początkowej lokalnej zmiennej fruitName.
local fruitName = "Czekolada"
local fruitTable = {
Lemon = "Żółty",
Apple = "Czerwony",
Orange = "Pomarańczowy"
}
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("Żółty")
print(fruit) -- Lemon
print(fruit .. ", nie " .. fruitName) -- Lemon, nie Czekolada