Funkcje to bloki kodu, które można wykonywać wielokrotnie na polecenie. Możesz je również połączyć z zdarzeniami lub przypisać jako zwroty.
Podstawowe funkcje
Definicja funkcji zawiera:
- Zakres funkcji (globalny lub local).
- Słowo kluczowe function.
- Nazwę funkcji w camelCase.
- Parametry funkcji w nawiasach (()).
- Blok kodu lub "ciało" funkcji.
- Słowo kluczowe end.
Ciało funkcji wykonuje się, gdy wywołasz funkcję. Aby wywołać funkcję, wpisz jej nazwę, a następnie nawiasy. Możesz zdefiniować zmienną, aby przyjąć wartość zwracaną lub użyć wartości zwracanej zamiast zmiennej.
-- Ta funkcja nie ma parametrów i zwraca nil
local function addOneAndTwo()
local result = 1 + 2
print(result)
end
-- Wywoływanie funkcji bez zwracania
addOneAndTwo() -- 3
Parametry
Parametry to zmienne, które udostępniasz funkcji i które są używane tylko w zakresie funkcji. Funkcje nie mają domyślnie parametrów. Jeśli wywołasz funkcję z większą liczbą parametrów, niż się spodziewa, Luau ignoruje dodatkowe parametry. Jeśli wywołasz funkcję z mniejszą liczbą parametrów, niż się spodziewa, Luau przekazuje nil dla wszystkich brakujących parametrów.
-- Ta funkcja ma dwa parametry: num1 i num2
local function addNumbers(num1, num2)
print(num1 + num2)
end
addNumbers(2, 3) -- 5
addNumbers(5, 6, 7) -- 11
addNumbers(9) -- próba wykonania operacji arytmetycznej (dodawania) na liczbie i nil
Zwracanie
W ciele funkcji słowo kluczowe return zwraca wynik obliczenia. Możesz zwracać wiele wartości z jednej funkcji. return kończy wykonanie funkcji, a Luau oczekuje, że słowo kluczowe end będzie następować po instrukcjach return, więc umieszczanie kodu między poleceniem return a poleceniem end spowoduje błąd.
-- Ta funkcja zwraca jedną wartość zwracającą
local function addNumbers(num1, num2)
local result = num1 + num2
return result
end
print(addNumbers(1, 2)) -- 3
local seven = addNumbers(3, 4)
print(seven) -- 7
-- Ta funkcja zwraca wiele wartości: suma i różnica
local function addAndSubtract(num1, num2)
local sum = num1 + num2
local difference = num1 - num2
return sum, difference
end
-- Wywoływanie funkcji i oczekiwanie wielu wartości zwracających
local sum, difference = addAndSubtract(2, 3)
print(sum) -- 5
print(difference) -- -1
Metody
Metody to funkcje, które są członkami obiektu, takiego jak klasa lub tabela. Oczekują one samego obiektu (self) jako pierwszego argumentu. Gdy wywołujesz metodę, użyj notacji z dwukropkiem (:) zamiast notacji kropkowej (.), aby automatycznie przekazać self jako pierwszy argument.
Wszystkie obiekty w Robloxie pochodzą od Instance i mają powszechnie używane metody, w tym Instance:Destroy(), Instance:Clone(), i Instance:FindFirstChild().
local Workspace = game:GetService("Workspace")-- Niszczenie części za pomocą notacji kropkowej (funkcja)local firstPart = Instance.new("Part")firstPart.Parent = Workspaceprint(firstPart.Parent) -- WorkspacefirstPart.Destroy(firstPart)print(firstPart.Parent) -- nil-- Niszczenie części za pomocą notacji z dwukropkiem (metoda)local secondPart = Instance.new("Part")secondPart.Parent = Workspaceprint(secondPart.Parent) -- WorkspacesecondPart:Destroy()print(secondPart.Parent) -- nil
Definiowanie metod
Aby stworzyć metodę w tabeli, użyj nazwy metody jako klucza, a funkcję metody jako wartość. W definicji metody parametr self odnosi się do tabeli nadrzędnej metody. Gdy wywołujesz metodę z użyciem notacji z dwukropkiem, przekazujesz tabelę jako pierwszy argument. Możesz zdefiniować parametry dla metody, ale musisz wypisać je po parametrze self.
W poniższym przykładzie tabela testButton ma metodę jako wartość klucza changeEnabled. Możesz zweryfikować, że self odnosi się do tabeli nadrzędnej metody, wypisując wartość self.enabled.
local testButton = {
enabled = true,
changeEnabled = function(self, isEnabled)
self.enabled = isEnabled
print(self.enabled)
end
}
print(testButton.enabled) -- true
-- Wywołanie metody
testButton:changeEnabled(false) -- false
Zwroty
Zwroty to funkcje, które wykonują się w odpowiedzi na inną funkcję lub proces.
Podstawowe zwroty
Funkcje mogą być przekazywane do innych funkcji, na przykład, anonimowa funkcja anonimowa może być użyta do wdrożenia zwrotu, który table.sort() następnie używa do sortowania listy Players z Players.GetPlayers().
local Players = game:GetService("Players")
local sortedPlayers = Players:GetPlayers()
table.sort(sortedPlayers, function(a, b)
-- Użyj anonimowego zwrotu, aby sortować graczy według imienia
return a.Name < b.Name
end)
W API Roblox zwroty odnoszą się do funkcji członkowskiej tylko do zapisu, zwroty czekają, aż zwrócą. Powszechnie używane zwroty obejmują:
- MarketplaceService.ProcessReceipt, która obsługuje zakupy produktów dewelopera.
- BindableFunction.OnInvoke, która wywołuje funkcję, gdy skrypt wywołuje BindableFunction:Invoke(...).
- RemoteFunction.OnClientInvoke, która wywołuje funkcję, gdy serwer wywołuje RemoteFunction:FireClient(player, ...) lub RemoteFunction:FireAllClients(...).
- RemoteFunction.OnServerInvoke, która wywołuje funkcję, gdy klient wywołuje RemoteFunction:InvokeServer(...).
Aby ustawić zwrot, przypisz mu funkcję. Na przykład, BindableFunction.OnInvoke to zwrot funkcji BindableFunction. Możesz ustawić nazwaną lub anonimową funkcję oraz możesz wywołać (użyć) tę funkcję, wywołując metodę :Invoke() na zwrocie. Argumenty, które przekazujesz do :Invoke(), przekazywane są do zwrotu, a wartość zwracana z funkcji zwrotnej wraca do wywołującego :Invoke().
local bindableFunction = Instance.new("BindableFunction")
bindableFunction.OnInvoke = function(number)
return 2 * number
end
print(bindableFunction:Invoke(42)) -- 84
Techniki funkcji
Obsługa zdarzeń
Możesz przypisać funkcję, znaną jako obsługa zdarzeń, do wykonania, gdy zdarzenie się zdarzy. Na przykład, możesz stworzyć funkcję o nazwie onPlayerAdded(), aby zdarzenie Players.PlayerAdded wypisało nazwę gracza, który dołącza. Aby uzyskać więcej informacji, zobacz Zdarzenia.
local Players = game:GetService("Players")
local function onPlayerAdded(player)
print(player.Name .. " dołączył do gry!")
end
Players.PlayerAdded:Connect(onPlayerAdded)
Funkcje anonimowe
Możesz tworzyć funkcje bez nazw, znane jako funkcje anonimowe, do używania jako zwroty i obsługi zdarzeń. Podobnie jak w przypadku nazwanych funkcji, funkcje anonimowe muszą zaczynać się i kończyć słowami kluczowymi function i end, ale nie potrzebujesz słowa kluczowego local, aby wskazać lokalny zasięg, ponieważ zawsze mają one lokalny zasięg.
W poniższym przykładzie, zwrot dla funkcji task.delay() i obsługa zdarzeń dla zdarzenia Players.PlayerAdded to obie funkcje anonimowe.
-- Funkcja anonimowa w zwrocie do task.delay()
task.delay(2, function(exactTimeElapsed)
print(exactTimeElapsed) -- 2.0064592329945
end)
-- Funkcja anonimowa w obsłudze zdarzeń
local Players = game:GetService("Players")
Players.PlayerAdded:Connect(function(player)
print(player.Name .. " dołączył do gry!")
end)
Funkcje w skryptach modułowych
Możesz ponownie używać funkcji w różnych skryptach, przechowując je w ModuleScripts. Funkcje są typem danych Luau, więc możesz je przechowywać w tabelach z innymi danymi.
Funkcje wariadyczne
Funkcja wariadyczna akceptuje dowolną liczbę argumentów. Na przykład, Globals.LuaGlobals.print() to funkcja wariadyczna.
print(2, "+", 2, "=", 2 + 2) --2 + 2 = 4print(string.format("Ciasto to %s!", "kłamstwo")) -- Ciasto to kłamstwo!print(string.char(115, 101, 99, 114, 101, 116)) -- sekret
Definiowanie funkcji wariadycznych
Aby zdefiniować funkcję wariadyczną, używasz tokena ... jako ostatniego lub jedynego parametru (nie mylić z .., operatorem konkatenacji operator). Możesz umieścić wartości ... w tabeli, aby ułatwić użytkowanie.
local function variadic(named, ...)
local arguments = {...} -- pakowanie dodatkowych argumentów do tabeli
print("Argument nazwany =", named)
for i, value in arguments do
print("Wejście nr.", i, "=", value)
end
end
variadic(10, "Cześć", 20, "Funkcja wariadyczna")
--[[ Ostateczny wynik:
Argument nazwany = 10
Wejście nr. 1 = Cześć
Wejście nr. 2 = 20
Wejście nr. 3 = Funkcja wariadyczna
]]
Przekazywanie argumentów
Możesz definiować funkcje wariadyczne jako opakowania wokół innych funkcji, aby przekazywać lub przesyłać argumenty z opakowania do innych funkcji.
local function printAround(functionToPrintAround, ...)
print("Przed")
functionToPrintAround(...)
print("Po")
end
local function addNumbers(x, y, z)
print("x =", x)
print("y + z =", y + z)
end
printAround(addNumbers, 1, 2, 3)
--[[ Ostateczny wynik:
Przed
x = 1
y + z = 5
Po
]]
Wywołanie funkcji wariadycznej z tablicami
Jeśli chcesz przekazać tablicę wartości do globalnej funkcji wariadycznej, takiej jak print(), możesz użyć globalnej funkcji unpack(), aby przekazać wartości tabeli zamiast samej tabeli.
local squares = {1, 4, 9, 16, 25}print("Pierwsze 5 liczb kwadratowych to:", unpack(squares))-- Pierwsze 5 liczb kwadratowych to 1 4 9 16 25