Fungsi adalah blok kode yang dapat Anda eksekusi beberapa kali atas perintah. Anda juga dapat menghubungkannya ke peristiwa atau menetapkannya sebagai callback.
Fungsi dasar
Definisi fungsi mencakup:
- Kata kunci function.
- Nama fungsi dalam camelCase.
- Parameter fungsi dalam tanda kurung (()).
- Blok kode, atau "badan", dari fungsi.
- Kata kunci end.
Badan fungsi dieksekusi ketika Anda memanggil fungsi tersebut. Untuk memanggil fungsi, ketik namanya diikuti dengan tanda kurung. Anda dapat mendefinisikan variabel untuk menerima nilai kembali atau menggunakan nilai kembali tersebut sebagai pengganti variabel.
-- Fungsi ini tidak memiliki parameter dan mengembalikan nil
local function addOneAndTwo()
local result = 1 + 2
print(result)
end
-- Memanggil fungsi tanpa nilai kembali
addOneAndTwo() -- 3Parameter
Parameter adalah variabel yang Anda sediakan untuk fungsi dan hanya digunakan dalam lingkup fungsi tersebut. Fungsi tidak memiliki parameter secara default. Jika Anda memanggil fungsi dengan lebih banyak parameter daripada yang diharapkan, Luau mengabaikan parameter tambahan. Jika Anda memanggil fungsi dengan lebih sedikit parameter daripada yang diharapkan, Luau akan mengirimkan nil untuk semua parameter yang hilang.
-- Fungsi ini memiliki dua parameter: num1 dan num2
local function addNumbers(num1, num2)
print(num1 + num2)
end
addNumbers(2, 3) -- 5
addNumbers(5, 6, 7) -- 11
addNumbers(9) -- mencoba melakukan aritmatika (penjumlahan) pada angka dan nilKembali
Dalam badan fungsi, kata kunci return mengembalikan hasil dari suatu perhitungan. Anda dapat mengembalikan beberapa nilai dari satu fungsi. return mengakhiri eksekusi fungsi, dan Luau mengharapkan kata kunci end mengikuti pernyataan return, jadi menulis kode antara perintah return dan perintah end akan menghasilkan kesalahan.
-- Fungsi ini mengembalikan satu nilai kembali
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
-- Fungsi ini mengembalikan beberapa nilai: jumlah dan selisih
local function addAndSubtract(num1, num2)
local sum = num1 + num2
local difference = num1 - num2
return sum, difference
end
-- Memanggil fungsi dan mengharapkan beberapa nilai kembali
local sum, difference = addAndSubtract(2, 3)
print(sum) -- 5
print(difference) -- -1Metode
Metode adalah fungsi yang merupakan anggota dari suatu objek, seperti kelas atau tabel. Mereka mengharapkan objek itu sendiri (self) sebagai argumen pertama. Ketika Anda memanggil metode, gunakan notasi titik dua (:) alih-alih notasi titik (.) untuk secara otomatis mengirimkan self sebagai argumen pertama.
Semua objek di Roblox diturunkan dari Instance dan memiliki metode yang umum digunakan termasuk Instance:Destroy(), Instance:Clone(), dan Instance:FindFirstChild().
local Workspace = game:GetService("Workspace")
-- Menghancurkan sebuah bagian dengan notasi titik (fungsi)
local firstPart = Instance.new("Part")
firstPart.Parent = Workspace
print(firstPart.Parent) -- Workspace
firstPart.Destroy(firstPart)
print(firstPart.Parent) -- nil
-- Menghancurkan sebuah bagian dengan notasi titik dua (metode)
local secondPart = Instance.new("Part")
secondPart.Parent = Workspace
print(secondPart.Parent) -- Workspace
secondPart:Destroy()
print(secondPart.Parent) -- nilMendefinisikan metode
Untuk membuat metode dalam tabel, gunakan nama metode sebagai kunci dan fungsi metode sebagai nilainya. Dalam definisi metode, parameter self merujuk pada tabel induk metode tersebut. Ketika Anda memanggil metode menggunakan notasi titik dua, Anda mengirimkan tabel itu sendiri sebagai argumen pertama. Anda dapat mendefinisikan parameter untuk metode, tetapi Anda perlu mencantumkannya setelah parameter self.
Dalam contoh berikut, tabel testButton memiliki metode sebagai nilai dari kunci changeEnabled. Anda dapat memverifikasi bahwa self merujuk pada tabel induk metode dengan mencetak nilai dari self.enabled.
local testButton = {
enabled = true,
changeEnabled = function(self, isEnabled)
self.enabled = isEnabled
print(self.enabled)
end
}
print(testButton.enabled) -- true
-- Memanggil metode
testButton:changeEnabled(false) -- falseCallback
Callback adalah fungsi yang dieksekusi sebagai respons terhadap fungsi atau proses lain.
Callback dasar
Fungsi dapat diteruskan ke fungsi lain, misalnya, fungsi anonim dapat digunakan untuk menerapkan callback yang kemudian digunakan oleh table.sort() untuk mengurutkan daftar Players dari Players.GetPlayers().
local Players = game:GetService("Players")
local sortedPlayers = Players:GetPlayers()
table.sort(sortedPlayers, function(a, b)
-- Menggunakan callback anonim untuk mengurutkan pemain berdasarkan nama
return a.Name < b.Name
end)Dalam API Roblox, callback merujuk pada anggota fungsi yang hanya dapat ditulis, callback menunggu hingga mereka mengembalikan nilai. Callback yang banyak digunakan termasuk:
- MarketplaceService.ProcessReceipt, yang menangani pembelian produk pengembang.
- BindableFunction.OnInvoke, yang memanggil fungsi ketika skrip memanggil BindableFunction:Invoke(...).
- RemoteFunction.OnClientInvoke, yang memanggil fungsi ketika server memanggil RemoteFunction:FireClient(player, ...) atau RemoteFunction:FireAllClients(...).
- RemoteFunction.OnServerInvoke, yang memanggil fungsi ketika klien memanggil RemoteFunction:InvokeServer(...).
Untuk mengatur callback, tetapkan fungsi ke dalamnya. Misalnya, BindableFunction.OnInvoke adalah callback dari BindableFunction. Anda dapat menetapkan fungsi bernama atau anonim ke dalamnya, dan Anda dapat memanggil (memanggil) fungsi tersebut dengan memanggil metode :Invoke() pada callback. Argumen yang Anda kirimkan ke :Invoke() diteruskan ke callback, dan nilai kembali dari fungsi callback dikembalikan kepada pemanggil :Invoke().
local bindableFunction = Instance.new("BindableFunction")
bindableFunction.OnInvoke = function(number)
return 2 * number
end
print(bindableFunction:Invoke(42)) -- 84Teknik fungsi
Penangan acara
Anda dapat menetapkan fungsi, yang dikenal sebagai penangan acara, untuk dieksekusi ketika suatu acara terjadi. Misalnya, Anda dapat membuat fungsi bernama onPlayerAdded() untuk acara Players.PlayerAdded untuk mencetak nama pemain yang bergabung. Untuk informasi lebih lanjut, lihat Acara.
local Players = game:GetService("Players")
local function onPlayerAdded(player)
print(player.Name .. " bergabung dengan permainan!")
end
Players.PlayerAdded:Connect(onPlayerAdded)Fungsi anonim
Anda dapat membuat fungsi tanpa nama, yang dikenal sebagai fungsi anonim, untuk digunakan sebagai callback dan penangan acara. Seperti fungsi bernama, fungsi anonim perlu dimulai dan diakhiri dengan kata kunci function dan end, tetapi Anda tidak perlu menggunakan kata kunci local untuk menunjukkan lingkup lokal karena mereka selalu memiliki lingkup lokal.
Dalam contoh berikut, callback untuk fungsi task.delay() dan penangan acara untuk acara Players.PlayerAdded keduanya adalah fungsi anonim.
-- Fungsi anonim dalam callback untuk task.delay()
task.delay(2, function(exactTimeElapsed)
print(exactTimeElapsed) -- 2.0064592329945
end)
-- Fungsi anonim dalam penangan acara
local Players = game:GetService("Players")
Players.PlayerAdded:Connect(function(player)
print(player.Name .. " bergabung dengan permainan!")
end)Fungsi dalam skrip modul
Anda dapat menggunakan kembali fungsi di beberapa skrip dengan menyimpannya dalam ModuleScripts. Fungsi adalah tipe data Luau, jadi Anda dapat menyimpannya dalam tabel bersama data lainnya.
Fungsi variadik
Fungsi variadik menerima jumlah argumen yang tidak terbatas. Misalnya, Globals.LuaGlobals.print() adalah fungsi variadik.
print(2, "+", 2, "=", 2 + 2) --2 + 2 = 4
print(string.format("The %s is a %s!", "cake", "lie")) -- Kue itu adalah kebohongan!
print(string.char(115, 101, 99, 114, 101, 116)) -- rahasiaMendefinisikan fungsi variadik
Untuk mendefinisikan fungsi variadik, Anda menggunakan token ... sebagai parameter terakhir atau satu-satunya (tidak boleh bingung dengan .., operator penggabungan operator). Anda dapat menempatkan nilai ... dalam tabel untuk kemudahan penggunaan.
local function variadic(named, ...)
local arguments = {...} -- mengemas argumen tambahan ke dalam tabel
print("Argumen bernama =", named)
for i, value in arguments do
print("Input No.", i, "=", value)
end
end
variadic(10, "Hai", 20, "Fungsi Variadik")
--[[ Hasil keluaran:
Argumen bernama = 10
Input No. 1 = Hai
Input No. 2 = 20
Input No. 3 = Fungsi Variadik
]]Meneruskan argumen
Anda dapat mendefinisikan fungsi variadik sebagai pembungkus di sekitar fungsi lain untuk meneruskan, atau meneruskan, argumen dari pembungkus ke fungsi lainnya.
local function printAround(functionToPrintAround, ...)
print("Sebelum")
functionToPrintAround(...)
print("Setelah")
end
local function addNumbers(x, y, z)
print("x =", x)
print("y + z =", y + z)
end
printAround(addNumbers, 1, 2, 3)
--[[ Hasil keluaran:
Sebelum
x = 1
y + z = 5
Setelah
]]Memanggil fungsi variadik dengan array
Jika Anda ingin meneruskan array tabel nilai ke fungsi variadik global, seperti print(), Anda dapat menggunakan fungsi global unpack() untuk meneruskan nilai tabel tersebut alih-alih tabel itu sendiri.
local squares = {1, 4, 9, 16, 25}
print("Lima angka kuadrat pertama adalah:", unpack(squares))
-- Lima angka kuadrat pertama adalah 1 4 9 16 25