Fonksiyonlar, kod bloklarıdır ve bunları komutla birden fazla kez çalıştırabilirsiniz. Ayrıca bunları olaylara bağlayabilir veya geri çağırmalar olarak atayabilirsiniz.
Temel fonksiyonlar
Bir fonksiyon tanımı şunları içerir:
- function anahtar kelimesi.
- Fonksiyonun adı camelCase formatında.
- 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ı parantez ile birlikte yazın. Dönüş değerini kabul etmek için bir değişken tanımlayabilir veya dönüş değerini bir değişken yerine kullanabilirsiniz.
-- Bu fonksiyonun parametreleri yoktur ve nil döner
local function addOneAndTwo()
local result = 1 + 2
print(result)
end
-- Dönüş değeri olmayan bir fonksiyonu çağırma
addOneAndTwo() -- 3Parametreler
Parametreler, fonksiyona sunduğunuz ve yalnızca fonksiyonun kapsamında kullanılan değişkenlerdir. Fonksiyonların varsayılan olarak parametreleri yoktur. Eğer bir fonksiyonu beklediğinden daha fazla parametre ile çağırırsanız, Luau fazladan parametreleri göz ardı eder. Eğer bir fonksiyonu beklediğinden daha az parametre ile çağırırsanız, Luau eksik olan 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ılar ve nil üzerinde aritmetik (toplama) yapma girişimiDönüş
Fonksiyonun gövdesinde, return anahtar kelimesi bir hesaplamadan bir sonuç döner. Bir fonksiyondan birden fazla değer dönebilirsiniz. return, fonksiyonun yürütülmesini sonlandırır ve Luau, return ifadelerinin ardından end anahtar kelimesinin gelmesini bekler, bu nedenle return komutu ile end komutu arasında kod yazmak bir hata oluşturur.
-- Bu fonksiyon bir 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 dönüş değeri bekleme
local sum, difference = addAndSubtract(2, 3)
print(sum) -- 5
print(difference) -- -1Metotlar
Metotlar, bir nesnenin, örneğin bir sınıf veya tablo gibi, üyesi olan fonksiyonlardır. İlk argüman olarak nesnenin kendisini (self) beklerler. Bir metodu çağırdığınızda, self'i otomatik olarak ilk argüman olarak geçirmek için iki nokta (:) notasyonunu kullanın.
Roblox'taki tüm nesneler Instance'dan türetilmiştir 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 = Workspace
print(firstPart.Parent) -- Workspace
firstPart.Destroy(firstPart)
print(firstPart.Parent) -- nil
-- İki nokta notasyonu ile bir parçayı yok etme (metot)
local secondPart = Instance.new("Part")
secondPart.Parent = Workspace
print(secondPart.Parent) -- Workspace
secondPart:Destroy()
print(secondPart.Parent) -- nilMetotları tanımlama
Bir tabloda bir metot oluşturmak için, metodun adını anahtar olarak ve metot fonksiyonunu değer olarak kullanın. Metodun tanımında, self parametresi metodun ana tablosunu ifade eder. İki nokta notasyonu kullanarak bir metodu çağırdığınızda, tabloyu ilk argüman olarak geçirirsiniz. Bir metot için parametreler tanımlayabilirsiniz, ancak bunları self parametresinden sonra listelemeniz gerekir.
Aşağıdaki örnekte, testButton tablosu changeEnabled anahtarının değeri olarak bir metoda sahiptir. self'in metodun ana tablosunu ifade ettiğini doğrulamak için self.enabled değerini yazdırabilirsiniz.
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) -- falseGeri çağırmalar
Geri çağırmalar, başka bir fonksiyon veya süreçle yanıt olarak yürütülen fonksiyonlardır.
Temel geri çağırmalar
Fonksiyonlar, diğer fonksiyonlara geçirilebilir; örneğin, bir anonim fonksiyon, table.sort()'un Players listesini sıralamak için kullandığı 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 üyesini ifade eder, geri çağırmalar döndüklerinde bekletilir. Yaygın olarak kullanılan geri çağırmalar şunlardır:
- MarketplaceService.ProcessReceipt, geliştirici ürü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ğırma ayarlamak için, ona bir fonksiyon atayın. Örneğin, BindableFunction.OnInvoke, BindableFunction'ın bir geri çağırmasıdır. Ona bir adlandırılmış veya anonim fonksiyon atayabilirsiniz ve bu fonksiyonu geri çağırma üzerinde :Invoke() metodunu çağırarak (çağırarak) çağırabilirsiniz. :Invoke()'ya geçirdiğiniz argümanlar geri çağırmaya iletilir ve geri çağırma fonksiyonunun dönüş değeri :Invoke()'nun çağrıcısına döner.
local bindableFunction = Instance.new("BindableFunction")
bindableFunction.OnInvoke = function(number)
return 2 * number
end
print(bindableFunction:Invoke(42)) -- 84Fonksiyon teknikleri
Olay işleyicileri
Bir olay tetiklendiğinde çalıştırılacak bir fonksiyonu, olay işleyici olarak atayabilirsiniz. Örneğin, Players.PlayerAdded olayına onPlayerAdded() adında bir fonksiyon oluşturarak, katılan oyuncunun adını yazdırabilirsiniz. Daha fazla bilgi için Olaylar sayfasına 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 olarak bilinen isimlendirilmemiş fonksiyonlar oluşturabilir ve bunları geri çağırmalar ve olay işleyicileri olarak kullanabilirsiniz. İsimlendirilmiş fonksiyonlar gibi, anonim fonksiyonlar da function ve end anahtar kelimeleri ile başlamalı ve bitmelidir, ancak her zaman yerel kapsamda oldukları için yerel kapsamı belirtmek için local anahtar kelimesine ihtiyacınız 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 bir geri çağırma olarak anonim fonksiyon
task.delay(2, function(exactTimeElapsed)
print(exactTimeElapsed) -- 2.0064592329945
end)
-- Olay işleyici olarak 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 fazla scriptte yeniden kullanabilirsiniz. Fonksiyonlar, Luau veri türü olduğundan, diğer verilerle birlikte tablolarda saklayabilirsiniz.
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 = 4
print(string.format("The %s is a %s!", "cake", "lie")) -- Kek bir yalandır!
print(string.char(115, 101, 99, 114, 101, 116)) -- gizliVariadik fonksiyonları tanımlama
Bir variadik fonksiyon tanımlamak için, son veya tek parametre olarak ... tokenını kullanırsınız (bu, .., bir birleştirme operatörü ile karıştırılmamalıdır). Kullanımı kolay olması için ... değerlerini bir tabloda toplayabilirsiniz.
local function variadic(named, ...)
local arguments = {...} -- ek argümanları bir tabloya paketle
print("İsimli argüman =", named)
for i, value in arguments do
print("Girdi No.", i, "=", value)
end
end
variadic(10, "Merhaba", 20, "Variadik Fonksiyon")
--[[ Sonuç çıktısı:
İsimli argüman = 10
Girdi No. 1 = Merhaba
Girdi No. 2 = 20
Girdi No. 3 = Variadik Fonksiyon
]]Argümanları iletme
Variadik fonksiyonları, argümanları sarmalayıp diğer fonksiyonlara iletmek veya aktarmak için sarmalayıcılar olarak 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
]]Bir variadik fonksiyonu dizilerle çağırma
Bir tablo dizisi değerini global bir variadik fonksiyona, örneğin print()'e geçirmek istiyorsanız, tabloyu değil, tablonun değerlerini geçirmek 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