函數 是 程式碼區塊,您可以根據命令多次執行。您也可以將它們連接到 事件 或將其指定為 回調。
基本函數
函數定義包含:
- 函數的 範圍(全域或 local)。
- function 關鍵字。
- 函數名稱,以 camelCase 格式。
- 函數的參數在括號中(())。
- 函數的程式碼區塊或「主體」。
- end 關鍵字。
當您調用函數時,函數的主體將執行。要調用函數,請輸入其名稱後接括號。您可以定義一個變數以接受返回值,或在變數的位置使用返回值。
-- 此函數沒有參數,並返回 nil
local function addOneAndTwo()
local result = 1 + 2
print(result)
end
-- 調用沒有返回值的函數
addOneAndTwo() -- 3
參數
參數是您可用於函數的變數,並且僅在函數的 範圍 中使用。函數默認沒有參數。如果您以超過期望的參數數量調用函數,Luau 將忽略多餘的參數。如果您以少於期望的參數數量調用函數,Luau 將為所有缺失的參數傳遞 nil。
-- 此函數有兩個參數:num1 和 num2
local function addNumbers(num1, num2)
print(num1 + num2)
end
addNumbers(2, 3) -- 5
addNumbers(5, 6, 7) -- 11
addNumbers(9) -- 嘗試對數字和 nil 執行算術(加)
返回
在函數的主體中,return 關鍵字從計算中返回結果。您可以從一個函數返回多個值。return 結束函數執行,Luau 期望在 return 語句後跟隨 end 關鍵字,因此在 return 命令和 end 命令之間編寫程式碼會引發錯誤。
-- 此函數返回一個返回值
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
-- 此函數返回多個值:和與差
local function addAndSubtract(num1, num2)
local sum = num1 + num2
local difference = num1 - num2
return sum, difference
end
-- 調用函數並期望多個返回值
local sum, difference = addAndSubtract(2, 3)
print(sum) -- 5
print(difference) -- -1
方法
方法是對象的成員函數,例如 類 或 表格。它們期望對象本身(self)作為第一個參數。當您調用方法時,使用冒號表示法(:)自動將 self 作為第一個參數傳遞。
Roblox 中的所有對象都衍生自 Instance,並具有包括 Instance:Destroy()、Instance:Clone() 和 Instance:FindFirstChild() 等常用方法。
local Workspace = game:GetService("Workspace")-- 使用點表示法(函數)銷毀一個部件local firstPart = Instance.new("Part")firstPart.Parent = Workspaceprint(firstPart.Parent) -- WorkspacefirstPart.Destroy(firstPart)print(firstPart.Parent) -- nil-- 使用冒號表示法(方法)銷毀一個部件local secondPart = Instance.new("Part")secondPart.Parent = Workspaceprint(secondPart.Parent) -- WorkspacesecondPart:Destroy()print(secondPart.Parent) -- nil
定義方法
要在表格中創建方法,請將方法名稱作為鍵,將方法函數作為值。在方法定義中,self 參數指的是方法的父表格。當您使用冒號表示法調用方法時,您將表格本身作為第一個參數傳遞。您可以為方法定義參數,但需要在 self 參數後列出它們。
在以下示例中,testButton 表格的 changeEnabled 鍵的值為一個方法。您可以通過打印 self.enabled 的值來驗證 self 是否指向方法的父表格。
local testButton = {
enabled = true,
changeEnabled = function(self, isEnabled)
self.enabled = isEnabled
print(self.enabled)
end
}
print(testButton.enabled) -- true
-- 調用方法
testButton:changeEnabled(false) -- false
回調
回調是根據另一個函數或過程執行的函數。
基本回調
函數可以被傳遞到其他函數中,例如,匿名函數(匿名函數)可以用來實現回調,然後 table.sort() 使用此回調對來自 Players.GetPlayers() 的 Players 列表進行排序。
local Players = game:GetService("Players")
local sortedPlayers = Players:GetPlayers()
table.sort(sortedPlayers, function(a, b)
-- 使用匿名回調按名稱排序玩家
return a.Name < b.Name
end)
在 Roblox API 中,回調是指寫入式函數成員,回調將暫停直到它們返回。廣泛使用的回調包括:
- MarketplaceService.ProcessReceipt,處理開發者商品購買。
- BindableFunction.OnInvoke,當腳本調用 BindableFunction:Invoke(...) 時調用該函數。
- RemoteFunction.OnClientInvoke,當伺服器調用 RemoteFunction:FireClient(player, ...) 或 RemoteFunction:FireAllClients(...) 時調用該函數。
- RemoteFunction.OnServerInvoke,當客戶端調用 RemoteFunction:InvokeServer(...) 時調用該函數。
要設置回調,將一個函數分配給它。例如,BindableFunction.OnInvoke 是 BindableFunction 的一個回調。您可以將命名或 匿名 函數設置為它,您可以通過調用回調的 :Invoke() 方法來調用(調用)該函數。您傳遞給 :Invoke() 的參數將轉發到回調,並且回調函數的返回值將返回到 :Invoke() 的調用者。
local bindableFunction = Instance.new("BindableFunction")
bindableFunction.OnInvoke = function(number)
return 2 * number
end
print(bindableFunction:Invoke(42)) -- 84
函數技術
事件處理程序
您可以分配一個函數,稱為 事件處理程序,以在事件被觸發時執行。例如,您可以創建一個名為 onPlayerAdded() 的函數,對應於 Players.PlayerAdded 事件,以打印任何加入的玩家的名稱。欲了解更多信息,請參見 事件。
local Players = game:GetService("Players")
local function onPlayerAdded(player)
print(player.Name .. " 加入了遊戲!")
end
Players.PlayerAdded:Connect(onPlayerAdded)
匿名函數
您可以創建沒有名稱的函數,稱為 匿名函數,用作 回調 和 事件處理程序。與命名函數一樣,匿名函數需要以 function 和 end 關鍵字開始和結束,但您不需要使用 local 關鍵字來指示本地範圍,因為它們始終具有本地範圍。
在以下示例中,task.delay() 函數的回調和 Players.PlayerAdded 事件的事件處理程序都是匿名函數。
-- 在回調中使用的匿名函數
task.delay(2, function(exactTimeElapsed)
print(exactTimeElapsed) -- 2.0064592329945
end)
-- 在事件處理程序中使用的匿名函數
local Players = game:GetService("Players")
Players.PlayerAdded:Connect(function(player)
print(player.Name .. " 加入了遊戲!")
end)
模組腳本中的函數
您可以通過將它們存儲在 ModuleScripts 中來重用多個腳本中的函數。函數是一種 Luau 數據類型,因此您可以將它們與其他數據一起存儲在表格中。
可變參數函數
可變參數函數接受任意數量的參數。例如,Globals.LuaGlobals.print() 是一個可變參數函數。
print(2, "+", 2, "=", 2 + 2) --2 + 2 = 4print(string.format("這個 %s 是一個 %s!", "蛋糕", "謊言")) -- 這個蛋糕是一個謊言!print(string.char(115, 101, 99, 114, 101, 116)) -- secret
定義可變參數函數
要定義可變參數函數,您需要使用 ... 標記作為最後一個或唯一的參數(不要與 .. 這個連接 運算符 混淆)。您可以將 ... 值放入表格中以方便使用。
local function variadic(named, ...)
local arguments = {...} -- 將額外的參數打包到表格中
print("命名參數 =", named)
for i, value in arguments do
print("輸入編號", i, "=", value)
end
end
variadic(10, "嗨", 20, "可變參數函數")
--[[ 產生的輸出:
命名參數 = 10
輸入編號 1 = 嗨
輸入編號 2 = 20
輸入編號 3 = 可變參數函數
]]
轉發參數
您可以將可變參數函數定義為其他函數的包裝器,以便轉發或傳遞這些參數。
local function printAround(functionToPrintAround, ...)
print("之前")
functionToPrintAround(...)
print("之後")
end
local function addNumbers(x, y, z)
print("x =", x)
print("y + z =", y + z)
end
printAround(addNumbers, 1, 2, 3)
--[[ 產生的輸出:
之前
x = 1
y + z = 5
之後
]]
使用數組調用可變參數函數
如果您希望將一個表格數組的值傳遞給全域可變參數函數,例如 print(),您可以使用全域 unpack() 函數來傳遞表格的值,而不是整個表格。
local squares = {1, 4, 9, 16, 25}print("前五個平方數是:", unpack(squares))-- 前五個平方數是 1 4 9 16 25