Funkcje są blokami kodu, które możesz wykonać wielokrotnie za pomocą polecenia.Możesz również połączyć je z wydarzeniami lub przypisać je jako callbacky .
Podstawowe funkcje
Definicja funkcji obejmuje:
- Zakres funkcji (globalnej lub local).
- Klucz function .
- Nazwa funkcji w camelCase.
- Parametry funkcji w nawiasach ( () ).
- Blok kodu, lub "ciało", funkcji.
- Klucz end .
Ciało funkcji wykonuje się, gdy wzywasz funkcję.Aby wezwać funkcję, wpisz jej nazwę połączoną z nawiasami.Możesz zdefiniować zmienną, aby zaakceptować wartość zwrotną lub użyć wartości zwrotnej w miejsce 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ą zmiennymi, które udostępniasz funkcji i są używane tylko w zakresie funkcji scope.Funkcje nie mają domyślnych parametrów.Jeśli wezwiesz funkcję z większą liczbą parametrów niż oczekuje, Luau ignoruje dodatkowe parametry.Jeśli wezwiesz funkcję z mniejszą liczbą parametrów niż oczekuje, Luau przekazuje nil za wszystkie brakujące parametry.
-- 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 klucz return zwraca wynik z obliczeń.Możesz zwrócić wiele wartości z jednej funkcji.return kończy wykonanie funkcji, a Luau oczekuje, że klucz end będzie podążał za return oświadczeniami, więc pisanie kodu między poleceniem return i poleceniem end powoduje błąd.
-- Funkcja ta zwraca jedną wartość zwrotną
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 zwrotnych
local sum, difference = addAndSubtract(2, 3)
print(sum) -- 5
print(difference) -- -1
Metody
Metody są funkcjami, które są członkami obiektu, takimi jak klasa lub tabela.Oczekują obiektu samodzielnego ( self ) jako pierwszego argumentu.Gdy wywołasz metodę, użyj notacji kolonki ( : ) zamiast notacji kropki ( . ), aby przekazać self jako pierwszy argument automatycznie.
Wszystkie obiekty w Roblox pochodzą z Instance i mają wspólnie używane metody, w tym Instance:Destroy(), Instance:Clone() i Instance:FindFirstChild().
local Workspace = game:GetService("Workspace")-- Niszczenie części z notacją punktową (funkcja)local firstPart = Instance.new("Part")firstPart.Parent = Workspaceprint(firstPart.Parent) -- Przestrzeń roboczafirstPart.Destroy(firstPart)print(firstPart.Parent) -- niezerowy-- Niszczenie części z notacją kolonową (metoda)local secondPart = Instance.new("Part")secondPart.Parent = Workspaceprint(secondPart.Parent) -- Przestrzeń roboczasecondPart:Destroy()print(secondPart.Parent) -- nil
Określ metody
Aby utworzyć metodę w tabeli, użyj nazwy metody jako klucz i funkcji metody jako wartość.W definicji metody parametr self odnosi się do tablicy rodziczej metody.Gdy wzywasz metodę za pomocą kolonkowego zapisu, przekazujesz samą tabelę 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 zweryfikować, że self odnosi się do tablicy 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) -- prawda
-- Wezwij metodę
testButton:changeEnabled(false) -- false
Wezwania powrotne
Wezwania są funkcjami, które wykonują w odpowiedzi na inną funkcję lub proces.
Podstawowe wezwania
Funkcje mogą być przekazywane do innych funkcji, na przykład, anonimowa funkcja może być użyta do wdrożenia powrotu, który następnie użyje do sortowania listy z .
local Players = game:GetService("Players")
local sortedPlayers = Players:GetPlayers()
table.sort(sortedPlayers, function(a, b)
-- Użyj anonimowego powrotu, aby sortować graczy według nazwy
return a.Name < b.Name
end)
W API Roblox callback-y odnoszą się do członekfunkcji tylko do odczytu, callback-y generują do czasu powrotu. Powszechnie używane callback-y obejmują:
- MarketplaceService.ProcessReceipt , który zajmuje się zakupami produktów dla programistó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ć powrót, przypisz funkcję do niego.Na przykład BindableFunction.OnInvoke jest powrotem wezwania BindableFunction.Możesz przypisać nazwaną lub anonimową funkcję do niej, a możesz ją wywołać ( wezwać ) za pomocą metody :Invoke() na powrocie.Argumenty, które przekazujesz do :Invoke() przekazujesz do powrotu funkcji callback, a wartość zwrotna z funkcji callback wraca do wezwającego :Invoke().
local bindableFunction = Instance.new("BindableFunction")
bindableFunction.OnInvoke = function(number)
return 2 * number
end
print(bindableFunction:Invoke(42)) -- 84
Techniki funkcyjne
Przetwarzacze zdarzeń
Możesz przypisać funkcję, znaną jako obsługa zdarzeń , do wykonania, gdy wystrzeli zdarzenie.Na przykład możesz utworzyć funkcję o nazwie onPlayerAdded() na wydarzenie Players.PlayerAdded, aby wydrukować nazwę każdego gracza, który dołącza.Aby uzyskać więcej informacji, zobacz Wydarzenia.
local Players = game:GetService("Players")
local function onPlayerAdded(player)
print(player.Name .. " joined the game!")
end
Players.PlayerAdded:Connect(onPlayerAdded)
Funkcje anonimowe
Możesz tworzyć funkcje bez nazw, znane jako funkcje anonimowe , które można używać jako callbacky i obsługi zdarzeń .Podobnie jak nazwane funkcje, funkcje bez nazwy muszą rozpoczynać się i kończyć za pomocą kluczów function i end, ale nie potrzebujesz klucza local, aby wskazać lokalny zakres, ponieważ zawsze mają lokalny zakres.
W poniższym przykładzie funkcja zwrotna dla funkcji task.delay() i event handler dla wydarzenia Players.PlayerAdded są obie anonimowymi funkcjami.
-- Anonimowa funkcja w odwołaniu do task.delay()
task.delay(2, function(exactTimeElapsed)
print(exactTimeElapsed) -- 2.0064592329945
end)
-- Funkcja anonimowa w obsługiwaczu zdarzeń
local Players = game:GetService("Players")
Players.PlayerAdded:Connect(function(player)
print(player.Name .. " joined the game!")
end)
Funkcje w skryptach modułowych
Możesz ponownie używać funkcji w wielu skryptach, przechowując je w ModuleScripts.Funkcje są wpisywaćdanych Luau, więc możesz je przechowywać w tabelach z innymi danymi.
Funkcje wieloznakowe
Funkcja variacyjna akceptuje dowolną liczbę argumentów. Na przykład, Globals.LuaGlobals.print() jest funkcją variacyjną.
print(2, "+", 2, "=", 2 + 2) --2 + 2 = 4print(string.format("The %s is a %s!", "cake", "lie")) -- Ciasto jest kłamstwem!print(string.char(115, 101, 99, 114, 101, 116)) -- secret
Określ funkcje wieloznaczne
Aby zdefiniować funkcję variacyjną, użyj tokenu jako ostatniego lub jedynego parametru (nie należy go mylić z , operatorem łączenia ).Możesz umieścić wartości ... w tabeli dla łatwości użytkowania.
local function variadic(named, ...)
local arguments = {...} -- opakuj dodatkowe argumenty w tabelę
print("Named argument =", named)
for i, value in arguments do
print("Input No.", i, "=", value)
end
end
variadic(10, "Hi", 20, "Variadic Function")
--[[ Wynikowe wyjście:
Named argument = 10
Input No. 1 = Hi
Input No. 2 = 20
Input No. 3 = Variadic Function
]]
Przedstaw argumenty
Możesz określić funkcje variacyjne jako okaleczające inne funkcje, aby przepustkalub przekazać argumenty z okaleczenia 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)
--[[ Wynikowe wyjście:
Before
x = 1
y + z = 5
After
]]
Wezwij funkcję variacyjną z tablicami
Jeśli chcesz przekazać tablicę wartości do globalnej funkcji variacyjnej, 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