Zakres

*Ta zawartość została przetłumaczona przy użyciu narzędzi AI (w wersji beta) i może zawierać błędy. Aby wyświetlić tę stronę w języku angielskim, kliknij tutaj.

W skryptowaniu blok kodu jest ciałem struktury kontroli lub funkcji .Zakres zmiennej lub funkcji to blok kodu, który może do niej uzyskać dostęp, i może to być globalny lub lokalny .Wszystkie bloki mogą uzyskiwać dostęp do globalnych zmiennych i funkcji.Blok może uzyskiwać lokalne zmienne i funkcje w bloku rodzicznym, ale nie w żadnym z jego dziecięcych bloków.

Zmienne i funkcje mają globalny zakres domyślnie, ale prawie zawsze lepiej je deklarować z lokalnym zakresem, ponieważ Luau uzyskuje dostęp do lokalnych zmiennych i funkcji szybciej niż globalne.Aby dać zmiennej lub funkcji lokalny zakres, umieść klucz local przed jej nazwą, gdy ją deklarujesz.

Skrypty nie mogą uzyskiwać globalnych i lokalnych zmiennych lub funkcji w innych skryptach.Jeśli chcesz udostępniać wartości i funkcje 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 zmiennej lokalnej 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ęp do lokalnych zmiennych i funkcji w blokach B lub C.
  • Blok B nie może uzyskać dostęp do zmiennej lokalnej w bloku C.

Globalny zakres

Po zadeklarowaniu globalnej zmiennej lub funkcji każdy blok kodu w tym samym skrypcie może do niej uzyskać dostęp.Zmienne i funkcje mają globalny zakres, chyba że oznaczysz je kluczową local ładowaniem.

W następnym kodzie testVar ma globalny zakres w lokalnej funkcji testFunc().Kiedy Luau dzwoni do testFunc(), przypisuje testVar wartość 64.Funkcja testVar ma globalny zakres, więc funkcja print() poza testFunc() może do niej uzyskać dostęp i wydrukować 64 .

Example of global functions and variables

local function testFunc() -- lokalny zakres
testVar = 64 -- ogólnoświatowy zakres
end
testFunc()
print(testVar) -- 64

W następnym kodzie zmienna globalna rozpoczyna się od , zwiększa o za każdym razem, gdy powtarza się pętla , a następnie drukuje ponownie z ostateczną wartością 4.


x = 0 -- Globalna zmienna "x"
for i = 1, 4 do
x += 1
print("Global 'x' = " .. x)
end
print("Global 'x' = " .. x)
--[[ Wynikowe wyjście:
Global 'x' = 1
Global 'x' = 2
Global 'x' = 3
Global 'x' = 4
Global 'x' = 4
]]

Łatwiej jest deklarować globalne zmienne i funkcje, ponieważ nie musisz tak wiele pisać, ale globalne zmienne i funkcje mają następujące wady w porównaniu z lokalnymi:

  • Luau uzyskuje globalne zmienne i funkcje za pomocą wyszukiwania hasha, więc jest drogie w użyciu pod względem wykonywanie.Użycie globalnej zmiennej w pętlu krytycznym czasowo może sprawić, że wykonuje się o ponad 10% wolniej niż używanie lokalnej zmiennej w tym samym pętlu.
  • Luau usuwa lokalne zmienne po zakończeniu ich zakresu, zmniejszając zużycie pamięci.
  • Możesz uzyskać dostęp do globalnych zmiennych i funkcji w tym samym skrypcie, ale nie między wieloma skryptami.Dlatego globalna zmienna lub funkcja nie zapewnia żadnych korzyści nad lokalnym odpowiednikiem w zakresie, wartością powrotną lub cieniem .

Lokalny zakres

Luau może uzyskać dostęp tylko do lokalnej zmiennej lub funkcji w bloku kodu, w którym ją deklarujesz.Tworzenie zmiennej z lokalnym zakresem daje Ci większą kontrolę nad tym, kiedy i gdzie zmienia się jej wartość.

W następnym kodzie funkcja testFunc() i zmienna testVar mają lokalny zakres.Tylko kod w granicach testFunc() może uzyskać dostęp do zmiennej testVar.变量 testVar nie ma wartości poza testFunc() , więc wezwanie print(testVar) wewnątrz testFunc() drukuje wartość testVar , ale wezwanie 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 następnym kodzie zmienna lokalna x ma wartość 0 na linii 1.W miarę powtarzania się pętla Luau, inna lokalna zmienna ma wartość .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 -- Różna zmienna "x", lokalna do tego cyklu "for"
print("Loop 'x' = " .. x)
end
print("Initial 'x' = " .. x)
--[[ Wynikowe wyjście:
Loop 'x' = 1
Loop 'x' = 1
Loop 'x' = 1
Loop 'x' = 1
Initial 'x' = 0
]]

Przechwyć

Po zadeklarowaniu i przypisaniu lokalnej zmiennej możesz ją odczytać na poziomie zakresu i funkcjach, których zakres jest ograniczony przez ten sam zakres zawierający lokalną zmienną.Ta technika jest znana jako przechwytywanie .

W następnym kodzie funkcja f przechwytuje lokalną zmienną x.Zmienna x w f() jest wartością w górę .


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ć na poziomie zakresu i poziomach zakresu podrzędnych.Jeśli ponownie zadeklarujesz i przypiszesz zmienną w poziomie podrzędnego zakresu, stworzysz nową lokalną zmienną o tej samej nazwie, ale o innym wartości od najbardziej poprzedniej przypisu.Nowa lokalna zmienna nie wpływa na zmienną lokalną z poprzedniego przypisania.Ta technika, znana jako shadowing , pomaga ci ponownie używać nazwy zmiennej bez ponownego używania jej wartości.

W następnym kodzie Luau cieniuje zmienną . Zmienna w jest zmienną cieniem .


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 przypisania jej wartości, abyś mógł ponownie przypisać zmienną na poziomie jej zakresu i poziomach podrzędnych.Odnowienie lokalnej zmiennej bez przypisania jej wartości ustawia jej wartość na nil .

W następnym kodzie Luau cieniuje 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ętla , która przypisuje wartość do .Po pętlu for funkcja zwraca zmienną cienia fruitName.Przez całą funkcję fruitName jest tą samą lokalną zmienną, która nie zastępuje początkowej lokalnej zmiennej 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) -- Cytryna
print(fruit .. ", not " .. fruitName) -- Lemon, not Chocolate