Fungsi adalah blok kode yang dapat Anda eksekusi berkali-kali sesuai perintah. Anda juga dapat menghubungkannya dengan peristiwa atau menetapkannya sebagai callback.
Fungsi dasar
Definisi fungsi mencakup:
- cakupan dari fungsi (global atau local).
- Kata kunci function.
- Nama fungsi dalam camelCase.
- Parameter dari fungsi dalam tanda kurung (()).
- Blok kode, atau "badan", dari fungsi.
- Kata kunci end.
Badan dari 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 sebagai pengganti variabel.
-- Fungsi ini tidak memiliki parameter dan mengembalikan nil
local function addOneAndTwo()
local result = 1 + 2
print(result)
end
-- Memanggil fungsi tanpa pengembalian
addOneAndTwo() -- 3
Parameter
Parameter adalah variabel yang Anda buat tersedia untuk fungsi dan hanya digunakan dalam cakupan fungsi. Secara default, fungsi tidak memiliki parameter. 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 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 aritmetika (penjumlahan) pada angka dan nil
Kembali
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 diikuti oleh pernyataan return, jadi menulis kode antara perintah return dan perintah end akan menyebabkan 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) -- -1
Metode
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 mengirimkan self sebagai argumen pertama secara otomatis.
Semua objek di Roblox diturunkan dari Instance dan memiliki metode yang sering 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 = Workspaceprint(firstPart.Parent) -- WorkspacefirstPart.Destroy(firstPart)print(firstPart.Parent) -- nil-- Menghancurkan sebuah bagian dengan notasi titik dua (metode)local secondPart = Instance.new("Part")secondPart.Parent = Workspaceprint(secondPart.Parent) -- WorkspacesecondPart:Destroy()print(secondPart.Parent) -- nil
Mendefinisikan 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 dengan notasi titik dua, Anda mengirimkan tabel itu sendiri sebagai argumen pertama. Anda dapat mendefinisikan parameter untuk metode, tetapi Anda perlu menyebutkannya 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) -- false
Callback
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 mengimplementasikan sebuah callback yang kemudian digunakan oleh table.sort() untuk mengurutkan daftar dari Players dari Players.GetPlayers().
local Players = game:GetService("Players")
local sortedPlayers = Players:GetPlayers()
table.sort(sortedPlayers, function(a, b)
-- Gunakan callback anonim untuk mengurutkan pemain berdasarkan nama
return a.Name < b.Name
end)
Dalam API Roblox, callback mengacu pada anggota fungsi hanya-tulis, callback menunggu sampai mereka mengembalikan nilai. Callback yang banyak digunakan termasuk:
- MarketplaceService.ProcessReceipt, yang menangani pembelian produk pengembang.
- BindableFunction.OnInvoke, yang memanggil fungsi ketika sebuah 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 menetapkan sebuah callback, tetapkan sebuah fungsi ke dalamnya. Misalnya, BindableFunction.OnInvoke adalah callback dari BindableFunction. Anda dapat mengatur fungsi bernama atau anonim ke dalamnya, dan Anda dapat memanggil (memicu) fungsi tersebut dengan memanggil metode :Invoke() pada callback. Argumen yang Anda kirimkan ke :Invoke() diteruskan ke callback, dan nilai kembali dari fungsi callback kembali kepada pemanggil dari :Invoke().
local bindableFunction = Instance.new("BindableFunction")
bindableFunction.OnInvoke = function(number)
return 2 * number
end
print(bindableFunction:Invoke(42)) -- 84
Teknik fungsi
Penangan acara
Anda dapat menetapkan sebuah fungsi, yang dikenal sebagai penangan acara, untuk dieksekusi ketika sebuah acara terjadi. Misalnya, Anda dapat membuat fungsi bernama onPlayerAdded() untuk acara Players.PlayerAdded untuk mencetak nama pemain yang bergabung. Untuk informasi lebih lanjut, lihat Events.
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, 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 ruang lingkup lokal karena mereka selalu memiliki ruang lingkup lokal.
Dalam contoh berikut, callback untuk fungsi task.delay() dan penangan acara untuk acara Players.PlayerAdded adalah kedua-duanya 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 berbagai skrip dengan menyimpannya dalam ModuleScripts. Fungsi adalah tipe data Luau, jadi Anda dapat menyimpannya dalam tabel bersama data lainnya.
Fungsi variadic
Fungsi variadic menerima jumlah argumen yang tidak terbatas. Misalnya, Globals.LuaGlobals.print() adalah fungsi variadic.
print(2, "+", 2, "=", 2 + 2) --2 + 2 = 4print(string.format("The %s is a %s!", "cake", "lie")) -- The cake is a lie!print(string.char(115, 101, 99, 114, 101, 116)) -- secret
Mendefinisikan fungsi variadic
Untuk mendefinisikan fungsi variadic, Anda menggunakan token ... sebagai parameter terakhir atau satu-satunya (tidak boleh bingung dengan .., operator penggabungan operator). Anda dapat menempatkan nilai ... dalam tabel untuk memudahkan penggunaan.
local function variadic(named, ...)
local arguments = {...} -- kemas argumen tambahan ke dalam tabel
print("Argumen bernama =", named)
for i, value in arguments do
print("Input No.", i, "=", value)
end
end
variadic(10, "Hi", 20, "Fungsi Variadic")
--[[ Keluaran yang dihasilkan:
Argumen bernama = 10
Input No. 1 = Hi
Input No. 2 = 20
Input No. 3 = Fungsi Variadic
]]
Meneruskan argumen
Anda dapat mendefinisikan fungsi variadic sebagai pembungkus di sekitar fungsi lain untuk meneruskan, atau meneruskan, argumen dari pembungkus ke fungsi lain tersebut.
local function printAround(functionToPrintAround, ...)
print("Sebelum")
functionToPrintAround(...)
print("Sesudah")
end
local function addNumbers(x, y, z)
print("x =", x)
print("y + z =", y + z)
end
printAround(addNumbers, 1, 2, 3)
--[[ Keluaran yang dihasilkan:
Sebelum
x = 1
y + z = 5
Sesudah
]]
Memanggil fungsi variadic dengan array
Jika Anda ingin meneruskan tabel array nilai ke fungsi variadic global, seperti print(), Anda dapat menggunakan fungsi global unpack() untuk meneruskan nilai tabel daripada 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