Fonksiyonlar komut üzerinde birden çok kez yürütebileceğiniz kod blokları dır.Ayrıca onları etkinliklere bağlayabilir veya çağrılar olarak atayabilirsiniz.
Temel işlevler
Bir işlev tanımı şunları içerir:
- İşlevin kapsamı (küresel veya local).
- The function anahtar kelimesi.
- camelCase içindeki işlevin adı.
- Ebeveynli işlevin parametleri ( () ).
- İşlevin kod bloğu veya "vücut".
- The end anahtar kelimesi.
İşlevin vücudu, işlevi çağırdığınızda çalışır.Bir işlevi çağırmak için, ismini parantezlerle takip edin.Geri dönüş değerini kabul etmek veya bir değişkenin yerine geri dönüş değerini kullanmak için bir değişken tanımlayabilirsiniz.
-- Bu işlevin parametreleri yok ve nulsü döndürür
local function addOneAndTwo()
local result = 1 + 2
print(result)
end
-- Bir dönüş olmadan bir işlev çağırmak
addOneAndTwo() -- 3
Değerler
Değişkenler, işlev için kullanılabilir olan değişkenlerdir ve sadece işlevin kapsamında kullanılırlar.Fonksiyonlar varsayılan olarak parametere sahip değildir.Luau, beklediğinden daha fazla parametre ile bir işlev çağırırsanız, ek parametleri görmezden gelir.Eğer beklediğinden daha az parametre ile bir işlev çağırırsanız, Luau tüm kayıp parametler için nil geçer.
-- Bu işlevin iki parametri 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) -- attempt to perform arithmetic (add) on number and nil
Geri dön
İşlevin vücudunda, return anahtarı bir hesaplamadan bir sonuç döndürür.Bir işlevden birden fazla değer döndürebilirsiniz. return işlev yürütmesini bitirir ve Luau, end anahtarının return ifadelerini takip etmesini bekler, bu yüzden kod yazmak return komut ve end komut arasında bir hata atar.
-- Bu işlev bir dönüş değeri döndürür
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 işlev çok sayıda değer döndürür: toplama ve fark
local function addAndSubtract(num1, num2)
local sum = num1 + num2
local difference = num1 - num2
return sum, difference
end
-- Bir işlev çağırmak ve çok sayıda dönüş değeri beklemek
local sum, difference = addAndSubtract(2, 3)
print(sum) -- 5
print(difference) -- -1
Yöntemler
Yöntemler, bir nesnenin üyeleri olan fonksiyonlardır, örneğin bir sınıf veya tablo.Nesnenin kendisini ( self ) ilk argüman olarak beklerler.Bir yöntemi çağırdığınızda, nokta notasyonunun yerine kolon notasyonunu kullanın ( ) birinci argüman olarak otomatik olarak geçmek için nokta notasyonunun yerine kolon notasyonunu kullanın.
Roblox'taki tüm nesneler Instance 'dan iner ve ortak kullanılan yöntemler içerir Instance:Destroy() , Instance:Clone() ve Instance:FindFirstChild() .
local Workspace = game:GetService("Workspace")-- Nokta notasyonuyla bir parçayı yok etmek (fonksiyon)local firstPart = Instance.new("Part")firstPart.Parent = Workspaceprint(firstPart.Parent) -- Çalışma AlanıfirstPart.Destroy(firstPart)print(firstPart.Parent) -- sıfır-- Kolon notasyonuyla bir parçayı yok etmek (yöntem)local secondPart = Instance.new("Part")secondPart.Parent = Workspaceprint(secondPart.Parent) -- Çalışma AlanısecondPart:Destroy()print(secondPart.Parent) -- nil
Yöntemleri tanımla
Bir tabloda bir yöntem oluşturmak için, yöntemin adını anahtar ve yöntem işlevini değer olarak kullanın.Yöntem tanımında, self parametresi yöntemin ebeveyn tablosuna işaret eder.Kolon notasyonunu kullanarak bir yöntem çağırdığınızda, tablonun kendisini ilk argüman olarak geçersiniz.Bir yöntem için parametre tanımlayabilirsiniz, ancak bunları self parametresinden sonra listelemeniz gerekir.
Aşağıdaki örnekte, testButton tablosunun changeEnabled anahtarının değeri olarak bir yöntemi vardır.self değerini basarak yöntemin ebeveyn tablosuna işaret ettiğini doğrulayabilirsiniz self.enabled .
local testButton = {
enabled = true,
changeEnabled = function(self, isEnabled)
self.enabled = isEnabled
print(self.enabled)
end
}
print(testButton.enabled) -- doğru
-- Yöntemi çağır
testButton:changeEnabled(false) -- false
Geri çağrılar
Geri çağrılar, başka bir işlev veya sürece yanıt olarak çalışan işlevlerdir.
Temel geri çağrılar
Fonksiyonlar başka fonksiyonlara geçebilir, örneğin, anonim fonksiyonu, bir dizi sıralamak için kullanılan bir geri çağrıyı uygulamak için kullanılabilir, daha sonra bir listeyi sıralamak için .
local Players = game:GetService("Players")
local sortedPlayers = Players:GetPlayers()
table.sort(sortedPlayers, function(a, b)
-- Oyuncuları isimlere göre sıralamak için anonim bir geri arama kullan
return a.Name < b.Name
end)
Roblox API'sinde, geri çağrılar yalnızca yazma işlev üyesine işaret eder, geri çağrılar geri dönene kadar verirler. Geniş kullanılan geri çağrılar şunları içerir:
- MarketplaceService.ProcessReceipt , geliştirici ürün satın alımlarını ele alır.
- BindableFunction.OnInvoke , bir senaryo BindableFunction:Invoke(...) çağırdığında işlevi çağıran kişi.
- RemoteFunction.OnClientInvoke , sunucu çağırdığında işlevi çağıran, RemoteFunction:FireClient(player, ...) veya RemoteFunction:FireAllClients(...) .
- RemoteFunction.OnServerInvoke , bir istemci RemoteFunction:InvokeServer(...) çağırdığında işlevi çağıran kişi
Bir geri arama ayarlamak için, ona bir işlev atayın.Örneğin, BindableFunction.OnInvoke bir BindableFunction geri çağrısıdır.Buna adlı veya anonim işlevini ayarlayabilir ve bu işlevi geri çağırarak ( çağırabilirsiniz ) bu işlevi geri çağırabilirsiniz.:Invoke() geriye geçen argümanlar, geri çağrı işlevinden dönen dönüş değeri, çağrıcıya :Invoke() döner.
local bindableFunction = Instance.new("BindableFunction")
bindableFunction.OnInvoke = function(number)
return 2 * number
end
print(bindableFunction:Invoke(42)) -- 84
İşlev teknikleri
Etkinlik işlemcileri
Bir olay ateşlendiğinde çalıştırmak için bir işlev, etkinlik işlemcisi olarak bilinen, atayabilirsiniz.Örneğin, onPlayerAdded() adlı bir işlevi oluşturarak Players.PlayerAdded etkinliğine katılan herhangi bir oyuncunun adını yazdırabilirsiniz.Daha fazla bilgi için, Etkinlikler bakın.
local Players = game:GetService("Players")
local function onPlayerAdded(player)
print(player.Name .. " joined the game!")
end
Players.PlayerAdded:Connect(onPlayerAdded)
Anonim işlevler
İsimsiz işlevler oluşturabilirsiniz, anonim işlevler olarak bilinir, geri çağrılar ve etkinlik elektörleri kullanmak için.Adlı işlevler gibi, anonim işlevlerin başlangıcı ve bitişi function ve end anahtarlarıyla başlamalı ve bitmelidir, ancak yerel ölçek göstermek için local anahtarına ihtiyacınız yoktur, çünkü hep yerel ölçek vardır.
Aşağıdaki örnekte, task.delay() fonksiyonunun geri çağrısı ve Players.PlayerAdded etkinliğinin olay işleyicisi her ikisi de anonim işlevlerdir.
-- Görev.延迟() için anonim işlev
task.delay(2, function(exactTimeElapsed)
print(exactTimeElapsed) -- 2.0064592329945
end)
-- Bir etkinlik işlemcisinde anonim işlevi
local Players = game:GetService("Players")
Players.PlayerAdded:Connect(function(player)
print(player.Name .. " joined the game!")
end)
Modül kılavuzlarındaki işlevler
Fonksiyonları çeşitli senaryolarda yeniden kullanabilirsiniz, bunları ModuleScripts depolayarak.İşlevler bir Luau veri yaz, bu nedenle diğer verilerle tablolara saklayabilirsiniz.
Çeşitli işlevler
Çeşitli bir işlev herhangi bir sayıda argüman kabul eder. Örneğin, Globals.LuaGlobals.print() çeşitli bir işlevdir.
print(2, "+", 2, "=", 2 + 2) --2 + 2 = 4print(string.format("The %s is a %s!", "cake", "lie")) -- Pasta bir yalandır!print(string.char(115, 101, 99, 114, 101, 116)) -- secret
Çeşitli işlevler tanımlayın
Çeşitli bir işlev tanımlamak için, son veya tek değişken olarak ... jetonunu kullanırsınız (.. ile karıştırılmamalı, birleştirme operatörü).Kullanım kolaylığı için ... değerlerini bir tabloya yerleştirebilirsiniz.
local function variadic(named, ...)
local arguments = {...} -- ekstra argümanları bir tabloya paketleyin
print("Named argument =", named)
for i, value in arguments do
print("Input No.", i, "=", value)
end
end
variadic(10, "Hi", 20, "Variadic Function")
--[[ Sonuç çıkışı:
Named argument = 10
Input No. 1 = Hi
Input No. 2 = 20
Input No. 3 = Variadic Function
]]
Önceki argümanlar
Fonksiyonları çeşitli olarak tanımlayabilirsiniz, böylece başka işlevlerden biletveya diğer işlevlere aktarmak için kapakçıdan başka işlevlere argümanlar gönderebilirsiniz.
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)
--[[ Sonuç çıkışı:
Before
x = 1
y + z = 5
After
]]
Dizilerle çeşitli bir işlev çağır
Bir tablo değeri düğümü bir küresel çeşitli işlevine geçirmek istiyorsanız, örneğin print() , kürenin değerlerini tablonun kendisinin yerine global unpack() işlevi aracılığıyla geçirebilirsiniz.
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