Funkcje to bloki kodu, które możesz wykonywać wielokrotnie na żądanie. Możesz je również połączyć z zdarzeniami lub przypisać jako callbacki.
Podstawowe funkcje
Definicja funkcji obejmuje:
- Słowo kluczowe function.
- Nazwę funkcji w camelCase.
- Parametry funkcji w nawiasach (()).
- Blok kodu, czyli "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 w miejscu zmiennej.
-- Ta funkcja nie ma parametrów i zwraca nil
local function addOneAndTwo()
local result = 1 + 2
print(result)
end
-- Wywołanie funkcji bez zwrotu
addOneAndTwo() -- 3Parametry
Parametry to zmienne, które udostępniasz funkcji i są używane tylko w zakresie funkcji. Funkcje domyślnie nie mają parametrów. Jeśli wywołasz funkcję z większą liczbą parametrów, niż oczekuje, Luau zignoruje dodatkowe parametry. Jeśli wywołasz funkcję z mniejszą liczbą parametrów, niż oczekuje, Luau przekaże 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 arytmetyki (dodawania) na liczbie i nilZwracanie
W ciele funkcji słowo kluczowe return zwraca wynik z obliczenia. Możesz zwrócić 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 pisanie kodu między poleceniem return a poleceniem end spowoduje błąd.
-- Ta funkcja zwraca jedną wartość
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: sumę i różnicę
local function addAndSubtract(num1, num2)
local sum = num1 + num2
local difference = num1 - num2
return sum, difference
end
-- Wywołanie funkcji i oczekiwanie wielu wartości zwracanych
local sum, difference = addAndSubtract(2, 3)
print(sum) -- 5
print(difference) -- -1Metody
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 dwukropkowej (:) 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 = Workspace
print(firstPart.Parent) -- Workspace
firstPart.Destroy(firstPart)
print(firstPart.Parent) -- nil
-- Niszczenie części za pomocą notacji dwukropkowej (metoda)
local secondPart = Instance.new("Part")
secondPart.Parent = Workspace
print(secondPart.Parent) -- Workspace
secondPart:Destroy()
print(secondPart.Parent) -- nilDefiniowanie metod
Aby stworzyć metodę w tabeli, użyj nazwy metody jako klucza, a funkcji metody jako wartości. W definicji metody parametr self odnosi się do rodzica metody, czyli tabeli. Gdy wywołujesz metodę używając notacji dwukropkowej, przekazujesz samą tabelę jako pierwszy argument. Możesz zdefiniować parametry dla metody, ale musisz je wymienić po parametrze self.
W poniższym przykładzie tabela testButton ma metodę jako wartość klucza changeEnabled. Możesz zweryfikować, że self odnosi się do rodzica metody, drukują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) -- falseCallbacki
Callbacki to funkcje, które wykonują się w odpowiedzi na inną funkcję lub proces.
Podstawowe callbacki
Funkcje mogą być przekazywane do innych funkcji, na przykład, anonimowa funkcja może być użyta do zaimplementowania callbacka, który table.sort() następnie wykorzystuje 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 callbacka do sortowania graczy według nazwy
return a.Name < b.Name
end)W API Roblox, callbacki odnoszą się do funkcji członkowskiej tylko do zapisu, callbacki wstrzymują wykonanie, aż zwrócą. Powszechnie używane callbacki obejmują:
- MarketplaceService.ProcessReceipt, który obsługuje zakupy produktów dewelopera.
- BindableFunction.OnInvoke, który wywołuje funkcję, gdy skrypt wywołuje BindableFunction:Invoke(...).
- RemoteFunction.OnClientInvoke, który wywołuje funkcję, gdy serwer wywołuje RemoteFunction:FireClient(player, ...) lub RemoteFunction:FireAllClients(...).
- RemoteFunction.OnServerInvoke, który wywołuje funkcję, gdy klient wywołuje RemoteFunction:InvokeServer(...).
Aby ustawić callback, przypisz mu funkcję. Na przykład, BindableFunction.OnInvoke jest callbackiem BindableFunction. Możesz ustawić nazwane lub anonimowe funkcje, a funkcję tę możesz wywołać (wywołać) za pomocą metody :Invoke() na callbacku. Argumenty, które przekazujesz do :Invoke(), są przekazywane do callbacka, a wartość zwracana z funkcji callback zwraca się do wywołującego :Invoke().
local bindableFunction = Instance.new("BindableFunction")
bindableFunction.OnInvoke = function(number)
return 2 * number
end
print(bindableFunction:Invoke(42)) -- 84Techniki funkcji
Obsługa zdarzeń
Możesz przypisać funkcję, znaną jako obsługa zdarzeń, do wykonania, gdy zdarzenie się uruchomi. Na przykład, możesz stworzyć funkcję o nazwie onPlayerAdded(), aby obsłużyć zdarzenie Players.PlayerAdded, aby wydrukować 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życia jako callbacki i obsługi zdarzeń. Podobnie jak funkcje nazwane, funkcje anonimowe muszą zaczynać się i kończyć słowami kluczowymi function i end, ale nie musisz używać słowa kluczowego local, aby wskazać lokalny zakres, ponieważ zawsze mają lokalny zakres.
W poniższym przykładzie callback dla funkcji task.delay() oraz obsługa zdarzeń dla zdarzenia Players.PlayerAdded to obie funkcje anonimowe.
-- Funkcja anonimowa w callbacku 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 wielu 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() jest funkcją wariadyczną.
print(2, "+", 2, "=", 2 + 2) --2 + 2 = 4
print(string.format("The %s is a %s!", "ciasto", "kłamstwo")) -- Ciasto to kłamstwo!
print(string.char(115, 101, 99, 114, 101, 116)) -- sekretDefiniowanie funkcji wariadycznych
Aby zdefiniować funkcję wariadyczną, użyj tokena ... jako ostatniego lub jedynego parametru (nie mylić z .., operatorem konkatenacji operatorów). Możesz umieścić wartości ... w tabeli dla łatwiejszego użycia.
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")
--[[ 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 forwardować 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)
--[[ 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