Fonksiyonlar, kod bloklarıdır ve komutla birden çok kez çalıştırabilirsiniz. Ayrıca onları olaylarla bağlayabilir veya geri çağırmalar olarak atayabilirsiniz.
Temel fonksiyonlar
Bir fonksiyon tanımı şunları içerir:
- Fonksiyonun kapsamı (global veya local).
- function anahtar kelimesi.
- Fonksiyonun adı camelCase biçiminde.
- Fonksiyonun parametreleri parantez içinde (()).
- Fonksiyonun kod bloğu veya "gövdesi".
- end anahtar kelimesi.
Fonksiyonun gövdesi, fonksiyonu çağırdığınızda çalışır. Bir fonksiyonu çağırmak için adını yazıp ardından parantezleri ekleyin. Dönen değeri kabul etmek için bir değişken tanımlayabilir veya dönen değeri bir değişken yerine kullanabilirsiniz.
-- Bu fonksiyonun parametreleri yoktur ve nil döner
local function addOneAndTwo()
local result = 1 + 2
print(result)
end
-- Geri dönüşü olmayan bir fonksiyon çağrısı
addOneAndTwo() -- 3
Parametreler
Parametreler, fonksiyona erişiminizi sağladığınız değişkenlerdir ve yalnızca fonksiyonun kapsamında kullanılır. Fonksiyonların varsayılan olarak parametreleri yoktur. Eğer bir fonksiyonu beklediğinden daha fazla parametre ile çağırırsanız, Luau fazla parametreleri dikkate almaz. Eğer bir fonksiyonu beklediğinden daha az parametre ile çağırırsanız, Luau eksik tüm parametreler için nil geçirir.
-- Bu fonksiyonun iki parametresi vardır: num1 ve num2
local function addNumbers(num1, num2)
print(num1 + num2)
end
addNumbers(2, 3) -- 5
addNumbers(5, 6, 7) -- 11
addNumbers(9) -- sayı ve nil üzerinde aritmetik (toplama) yapmaya çalışma
Geri Dönüş
Fonksiyonun gövdesinde, return anahtar kelimesi bir hesaplamadan sonuç döndürür. Bir fonksiyondan birden fazla değer döndürebilirsiniz. return fonksiyon yürütmesini sonlandırır ve Luau döndürme ifadelerinin ardından end anahtar kelimesini bekler, bu nedenle return komutu ile end komutu arasında kod yazmak hata verir.
-- Bu fonksiyon bir geri dönüş değeri döner
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
-- Bu fonksiyon birden fazla değer döner: toplam ve fark
local function addAndSubtract(num1, num2)
local sum = num1 + num2
local difference = num1 - num2
return sum, difference
end
-- Bir fonksiyonu çağırma ve birden fazla geri dönüş değeri beklemeye
local sum, difference = addAndSubtract(2, 3)
print(sum) -- 5
print(difference) -- -1
Metotlar
Metotlar, bir nesnenin, örneğin bir sınıf veya tablo, bir üyesi olan fonksiyonlardır. İlk argüman olarak nesnenin kendisini (self) beklerler. Bir metodu çağırdığınızda, self'i ilk argüman olarak otomatik olarak geçmek için iki nokta (:) notasyonunu kullanın.
Roblox'taki tüm nesneler Instance'den türetilir ve Instance:Destroy(), Instance:Clone() ve Instance:FindFirstChild() gibi yaygın olarak kullanılan metodlara sahiptir.
local Workspace = game:GetService("Workspace")-- Nokta notasyonu ile bir parçayı yok etme (fonksiyon)local firstPart = Instance.new("Part")firstPart.Parent = Workspaceprint(firstPart.Parent) -- WorkspacefirstPart.Destroy(firstPart)print(firstPart.Parent) -- nil-- İki nokta notasyonu ile bir parçayı yok etme (metot)local secondPart = Instance.new("Part")secondPart.Parent = Workspaceprint(secondPart.Parent) -- WorkspacesecondPart:Destroy()print(secondPart.Parent) -- nil
Metotlar Tanımlama
Bir tabloda bir metot oluşturmak için, metotun adını anahtar olarak ve metot fonksiyonunu değer olarak kullanın. Metodun tanımında, self parametresi metodun ebeveyn tablosunu ifade eder. Bir metodu iki nokta notasyonu ile çağırdığınızda, tablonun kendisini ilk argüman olarak geçirirsiniz. Bir metot için parametreler tanımlayabilirsiniz, ancak bunları self parametresinin ardından listelemeniz gerekir.
Aşağıdaki örnekte, testButton tablosunun changeEnabled anahtarının değerinde bir metot bulunmaktadır. self'in metodun ebeveyn tablosunu ifade ettiğini doğrulamak için self.enabled değerini basabilirsiniz.
local testButton = {
enabled = true,
changeEnabled = function(self, isEnabled)
self.enabled = isEnabled
print(self.enabled)
end
}
print(testButton.enabled) -- true
-- Metodu çağır
testButton:changeEnabled(false) -- false
Geri Çağırmalar
Geri çağırmalar, başka bir fonksiyon veya işleme yanıt olarak çalışan fonksiyonlardır.
Temel geri çağırmalar
Fonksiyonlar başka fonksiyonlara geçirilebilir, örneğin, bir anonim fonksiyon, table.sort() tarafından Players.GetPlayers()'dan alınan Players listesini sıralamak için bir geri çağırma olarak kullanılabilir.
local Players = game:GetService("Players")
local sortedPlayers = Players:GetPlayers()
table.sort(sortedPlayers, function(a, b)
-- Oyuncuları isimlerine göre sıralamak için anonim bir geri çağırma kullan
return a.Name < b.Name
end)
Roblox API'sinde, geri çağırmalar yazma yalnızca bir fonksiyon üyesine atıfta bulunur, geri çağırmalar geri dönecek şekilde bekler. Yaygın olarak kullanılan geri çağırmalar şunlardır:
- MarketplaceService.ProcessReceipt, geliştirici ürün satın alımlarını işler.
- BindableFunction.OnInvoke, bir script BindableFunction:Invoke(...) çağırdığında fonksiyonu çağırır.
- RemoteFunction.OnClientInvoke, sunucu RemoteFunction:FireClient(player, ...) veya RemoteFunction:FireAllClients(...) çağırdığında fonksiyonu çağırır.
- RemoteFunction.OnServerInvoke, bir istemci RemoteFunction:InvokeServer(...) çağırdığında fonksiyonu çağırır.
Bir geri çağırmayı ayarlamak için, ona bir fonksiyon atayın. Örneğin, BindableFunction.OnInvoke BindableFunction'ın bir geri çağırmasıdır. Ona tanımlı veya anonim bir fonksiyonu atayabilirsiniz ve bu fonksiyonu, geri çağırma üzerindeki :Invoke() metodunu çağırarak (çağırarak) kullanabilirsiniz. :Invoke() metoduna geçirdiğiniz argümanlar geri çağırmaya iletilir ve geri çağırma fonksiyonundan dönen değer :Invoke() çağrısının yapanına döner.
local bindableFunction = Instance.new("BindableFunction")
bindableFunction.OnInvoke = function(number)
return 2 * number
end
print(bindableFunction:Invoke(42)) -- 84
Fonksiyon Teknikleri
Olay İşleyicileri
Bir olay tetiklendiğinde çalıştırılması için bir fonksiyon, olay işleyici olarak atanabilir. Örneğin, Players.PlayerAdded olayına onPlayerAdded() adında bir fonksiyon yaratabilirsiniz ve bu fonksiyon, oyuna katılan oyuncunun adını basar. Daha fazla bilgi için Olaylar bölümüne bakın.
local Players = game:GetService("Players")
local function onPlayerAdded(player)
print(player.Name .. " oyuna katıldı!")
end
Players.PlayerAdded:Connect(onPlayerAdded)
Anonim Fonksiyonlar
Anonim fonksiyonlar, geri çağırmalar ve olay işleyicileri olarak kullanılmak üzere isim olmadan yaratılan fonksiyonlardır. İsimli fonksiyonlar gibi, anonim fonksiyonlar da function ve end anahtar kelimeleri ile başlamalı ve bitmelidir, ancak her zaman yerel kapsama sahip olduğu için yerel kapsamı belirtmek için local anahtar kelimesine ihtiyaç yoktur.
Aşağıdaki örnekte, task.delay() fonksiyonu için geri çağırma ve Players.PlayerAdded olayı için olay işleyici her ikisi de anonim fonksiyonlardır.
-- task.delay() fonksiyonunda anonim fonksiyon
task.delay(2, function(exactTimeElapsed)
print(exactTimeElapsed) -- 2.0064592329945
end)
-- Olay işleyicide anonim fonksiyon
local Players = game:GetService("Players")
Players.PlayerAdded:Connect(function(player)
print(player.Name .. " oyuna katıldı!")
end)
Modül Scriptlerinde Fonksiyonlar
Fonksiyonları ModuleScripts içinde saklayarak birden çok scriptte tekrar kullanabilirsiniz. Fonksiyonlar, Luau veri türü olduğundan, diğer verilerle birlikte tablolara saklanabilir.
Variadik Fonksiyonlar
Variadik bir fonksiyon, herhangi bir sayıda argümanı kabul eder. Örneğin, Globals.LuaGlobals.print() bir variadik fonksiyondur.
print(2, "+", 2, "=", 2 + 2) --2 + 2 = 4print(string.format("The %s is a %s!", "cake", "lie")) -- Kek bir yalan!print(string.char(115, 101, 99, 114, 101, 116)) -- gizli
Variadik Fonksiyonlar Tanımlama
Bir variadik fonksiyon tanımlamak için, ... tokenını son veya tek parametre olarak kullanırsınız (konsatenasyon operatörü olan .. ile karıştırılmamalıdır). Kullanımı kolay hale getirmek için ... değerlerini bir tabloda toplayabilirsiniz.
local function variadic(named, ...)
local arguments = {...} -- ekstra argümanları bir tabloya paketle
print("İsimli argüman =", named)
for i, value in arguments do
print("Giriş No.", i, "=", value)
end
end
variadic(10, "Merhaba", 20, "Variadik Fonksiyon")
--[[ Sonuç çıktısı:
İsimli argüman = 10
Giriş No. 1 = Merhaba
Giriş No. 2 = 20
Giriş No. 3 = Variadik Fonksiyon
]]
Argümanları İletme
Başka fonksiyonlara geçmek veya iletmek için bir sarıcı olarak variadik fonksiyonlar tanımlayabilirsiniz.
local function printAround(functionToPrintAround, ...)
print("Önce")
functionToPrintAround(...)
print("Sonra")
end
local function addNumbers(x, y, z)
print("x =", x)
print("y + z =", y + z)
end
printAround(addNumbers, 1, 2, 3)
--[[ Sonuç çıktısı:
Önce
x = 1
y + z = 5
Sonra
]]
Array ile Variadik Fonksiyon Çağırma
Bir tablo dizisi değerini global bir variadik fonksiyona, örneğin print() fonksiyonuna geçirmek istiyorsanız, tabloyu kendi başına değil, tablonun değerlerini geçmek için global unpack() fonksiyonunu kullanabilirsiniz.
local squares = {1, 4, 9, 16, 25}print("İlk 5 kare sayısı:", unpack(squares))-- İlk 5 kare sayısı 1 4 9 16 25