Funkcje są blokami kodu, które możesz wykonać wiele razy przy użyciu komendy. Możesz również połączyć je z wydarzeniami lub przypisać je jako wezwania .
Podstawowe funkcje
Definicja funkcji zawiera:
- Zakres funkcji (globalny lub local).
- Kluczowe słowo function.
- Nazwa funkcji w camelCase .
- Parametry funkcji w nawiasach ( () ).
- Blok kodu, lub "ciało", funkcji.
- Konfigurator end
Ciało funkcji jest wykonane, gdy wezwiecie funkcję. Aby wejść do funkcji, wpisz jego nazwę wraz z nawiasami. Możesz zdefiniować zmienne, aby zaakceptować wartość zwracaną lub użyć wartości zwracanej zamiast zmiennej.
-- Funkcja ta nie ma parametrów i zwraca nil
local function addOneAndTwo()
local result = 1 + 2
print(result)
end
-- Wezwanie funkcji bez zwrotu
addOneAndTwo() -- 3
Parametry
Parametry są zmienne, które możesz udostępnić funkcji i są używane tylko w zakresie funkcji scope. Funkcje nie mają parametrów domyślnie. Jeśli wezwiesz funkcję z więcej parametrów niż oczekuje, Luau ignoruje dodatkowe parametry. Jeśli wezwiesz funkcję z mniej parametrów niż oczekuje, Luau przeprowadza nil dla wszystkich parametrów błędnych.
-- Funkcja ta 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) -- attempt to perform arithmetic (add) on number and nil
Powrót
W ciele funkcji return słowo kluczowe zwraca wynik z obliczenia. Możesz zwrócić wiele wartości z jednej funkcji. return zakończa wykonanie funkcji, a Luau oczekuje, że słowo kluczowe end będzie odpowiadać na 2>return
-- Funkcja ta 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
-- Funkcja ta 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
-- Wezwanie funkcji i oczekiwanie na wiele wartości zwrotu
local sum, difference = addAndSubtract(2, 3)
print(sum) -- 5
print(difference) -- -1
Metody
Methody są funkcjami, które są członkami obiektu, takimi jak klasa lub tabela. Oczekują one samego obiektu ( self ) jako pierwszego argumentu. Gdy wzywasz metodę, użyj znaku koliny ( 2> :2> ) zamiast znaku kropki ( 5> ) do przekaz
Wszystkie obiekty w Roblox pochodzą z Instance i mają używane metody, w tym Instance:Destroy() , Instance:Clone() i 1> Class.Instance:FindFirstChild()1>.
-- Niszczenie części z notacją kropki (funkcja)local firstPart = Instance.new("Part")firstPart.Parent = workspaceprint(firstPart.Parent) -- PracafirstPart.Destroy(firstPart)print(firstPart.Parent) -- nie ma-- Niszczenie części za pomocą zapisu kolonowego (metoda)local secondPart = Instance.new("Part")secondPart.Parent = workspaceprint(secondPart.Parent) -- PracasecondPart:Destroy()print(secondPart.Parent) -- nil
Definiowanie metod
Aby utworzyć metodę w tabeli, użyj imienia metody jako klucza i funkcji metody jako wartości. W definicji metody self parametr odnosi się do matki metody. Gdy wywołasz metodę za pomocą znaku kolonowego, przekazujesz tabelę samą jako pierwszy argument. Możesz określić parametry dla metody, ale musisz je wymienić po parametrze self
W następnym przykładzie tabela testButton ma metodę jako wartość klucza changeEnabled. Możesz sprawdzić, że self odnosi się do metody rodzicielskiej metody poprzez wydrukowanie wartości 2>self.enabled2>.
local testButton = {
enabled = true,
changeEnabled = function(self, isEnabled)
self.enabled = isEnabled
print(self.enabled)
end
}
print(testButton.enabled) -- prawdziwy
-- Zadzwoń metoda
testButton:changeEnabled(false) -- false
Wezwania
Kwoty są funkcjami, które są wykonywane w odpowiedzi na inną funkcję lub proces.
Podstawowe wezwania
Funkcje można przekazać do innych funkcji, na przykład funkcja anonimowa może zostać użyta do wdrożenia kodeksu zwrotów, który Library.table.sortować() i potem używa do sortowania listy table.sort() z Players.
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, wezwania odnoszą się do członka funkcji tylko do członek, a wezwania zwracają się, dopóki nie powrócą. Wiele używanych wezwywanych funkcji to:
- MarketplaceService.ProcessReceipt , który obsługuje zakupy produktów dla deweloperów.
- BindableFunction.OnInvoke , który wzywa funkcję, gdy skrypt wzywa BindableFunction:Invoke(...) .
- RemoteFunction.OnClientInvoke, który wzywa funkcję, gdy serwer wzywa RemoteFunction:FireClient(player, ...) lub RemoteFunction:FireAllClients(...).
- RemoteFunction.OnServerInvoke , który wzywa funkcję, gdy klient wzywa RemoteFunction:InvokeServer(...) .
Aby ustawić wiadomość zwrotną, przypisz funkcję do niej. Na przykład, BindableFunction.OnInvoke jest wiadomością zwrotną BindableFunction . Możesz ustawić
local bindableFunction = Instance.new("BindableFunction")
bindableFunction.OnInvoke = function(number)
return 2 * number
end
print(bindableFunction:Invoke(42)) -- 84
Techniki funkcjonalne
Przyczyny i skutki
Możesz przypisać funkcję, znaną jako obsługa zdarzeń, aby wykonać, gdy zdarzenie się uruchomi. Na przykład możesz stworzyć funkcję nazwaną onPlayerAdded() na wydarzeniu Players.PlayerAdded, aby wydrukować imię gracza, który dołączył. Dla więcej informacji, zobacz 2> wydarzenia2>.
local Players = game:GetService("Players")
local function onPlayerAdded(player)
print(player.Name .. " joined the game!")
end
Players.PlayerAdded:Connect(onPlayerAdded)
Anonimowe funkcje
Możesz tworzyć funkcje bez imienia, znane jako czyste funkcje, aby używać jako wezwywaczy i przetwarzaczy. Tak jak imienne funkcje, funkcje anonimowe muszą zacząć i zakończyć się z 2>funkcja2> i 5>end5> słow
W następnym przykładzie funkcja zwrotu dla funkcji task.delay() i wskaźnik wydarzenia dla funkcji Players.PlayerAdded są obie anonimowe funkcje.
-- Anonimowa funkcja w zwrocie w call_task.延迟()
task.delay(2, function(exactTimeElapsed)
print(exactTimeElapsed) -- 2.0064592329945
end)
-- Anonimowa funkcja w identyfikatorze wydarzeń
local Players = game:GetService("Players")
Players.PlayerAdded:Connect(function(player)
print(player.Name .. " joined the game!")
end)
Funkcje w Modułach
Możesz ponownie używać funkcji w wielu skryptach, przechowując je w ModuleScripts. Funkcje są wpisywaćdanych Luau, więc możesz je przechować w tabelach z innymi danymi.
Funkcje wariadyczne
Funkcja variadic przyjmuje dowolną liczbę argumentów. Na przykład, Globals.LuaGlobals.print() jest funkcją variadic.
print(2, "+", 2, "=", 2 + 2) --2 + 2 = 4print(string.format("The %s is a %s!", "cake", "lie")) -- Ciasto to kłamstwo!print(string.char(115, 101, 99, 114, 101, 116)) -- secret
Definowanie funkcji werystycznych
Aby zdefiniować funkcję variadic, używasz tokenu ... jako ostatniego lub jedynego parametru (nie mylić z .. operatorem concatenation). Możesz umieścić wartości ... w tabeli dla ułatwienia użycia.
local function variadic(named, ...)
local arguments = {...} -- spakuj dodatkowe argumenty w tabeli
print("Named argument =", named)
for i, value in arguments do
print("Input No.", i, "=", value)
end
end
variadic(10, "Hi", 20, "Variadic Function")
--[[ Wyświetlany wynik:
Named argument = 10
Input No. 1 = Hi
Input No. 2 = 20
Input No. 3 = Variadic Function
]]
Przekazywanie argumentów
Możesz zdefiniować funkcje werzyjne jako wiązania wokół innych funkcji, aby przepustkalub przekazać argumenty z wiązania do innych funkcji.
local function printAround(functionToPrintAround, ...)
print("Before")
functionToPrintAround(...)
print("After")
end
local function addNumbers(x, y, z)
print("x =", x)
print("y + z =", y + z)
end
printAround(addNumbers, 1, 2, 3)
--[[ Wyświetlany wynik:
Before
x = 1
y + z = 5
After
]]
Wyzwanie funkcji werystycznej z użyciem matryc
Jeśli chcesz przekazać globalnej funkcji wielostukowej wartości tabeli, 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("The first 5 square numbers are:", unpack(squares))-- The first 5 square numbers are 1 4 9 16 25