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ą uzyskiwać dostęp do globalnych zmiennych i funkcji. Blok może uzyskiwać dostęp do lokalnych zmiennych i funkcji w swoim bloku nadrzędnym, ale nie w żadnym z jego bloków podrzędnych.
Zmienne i funkcje mają domyślnie zakres globalny, ale prawie zawsze lepiej jest zadeklarować 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 deklaracji.
Skrypty nie mogą uzyskiwać dostępu do globalnych i lokalnych zmiennych lub 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 za pomocą słowa kluczowego 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.
local function testFunc() -- lokalny zakres
testVar = 64 -- globalny zakres
end
testFunc()
print(testVar) -- 64W poniższym kodzie globalna zmienna x zaczyna od 0, zwiększa się o 1 z każdą iteracją pętli for i ponownie drukuje po zakończeniu z końcową wartością 4.
x = 0 -- Globalna zmienna "x"
for i = 1, 4 do
x += 1
print("Global 'x' = " .. x)
end
print("Global 'x' = " .. x)
--[[ Wynik:
Global 'x' = 1
Global 'x' = 2
Global 'x' = 3
Global 'x' = 4
Global 'x' = 4
]]Łatwiej jest zadeklarować globalne zmienne i funkcje, ponieważ nie musisz pisać tyle, 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 haszowego, co jest kosztowne pod względem wydajności. Użycie globalnej zmiennej w pętli krytycznej czasowo może spowodować, że będzie działać o ponad 10% wolniej niż użycie lokalnej zmiennej 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. Tworzenie 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) wewnątrz 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) -- nilW 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 do
local x = 1 -- Inna zmienna "x", lokalna dla tej pętli "for"
print("Pętla 'x' = " .. x)
end
print("Początkowe 'x' = " .. x)
--[[ Wynik:
Pętla 'x' = 1
Pętla 'x' = 1
Pętla 'x' = 1
Pętla 'x' = 1
Początkowe 'x' = 0
]]Zmienne i funkcje const podlegają tym samym zasadom zakresu co local. Możesz je zadeklarować w dowolnym bloku, w tym wewnątrz innej funkcji. Aby uzyskać więcej informacji na temat const, zobacz Zmienne const.
Przechwytywanie
Po zadeklarowaniu i przypisaniu lokalnej zmiennej możesz ją odczytać w swoim poziomie zakresu oraz w funkcjach, których zakres jest zamknięty przez ten sam zakres zawierający lokalną zmienną. Ta technika 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) -- 5Cień
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, tworzysz nową lokalną zmienną o tej samej nazwie, ale innej wartości niż ostatnie przypisanie. Nowa lokalna zmienna nie wpływa na lokalną zmienną z poprzedniego przypisania. Ta technika, znana jako cieniowanie, pomaga ponownie używać nazwy 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) -- 5Możesz również ponownie zadeklarować lokalną zmienną bez przypisywania jej wartości, aby móc ponownie przypisać zmienną 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