函數

*此內容是使用 AI(Beta 測試版)翻譯,可能含有錯誤。若要以英文檢視此頁面,請按一下這裡

函數程式碼區塊,您可以根據命令多次執行。您也可以將它們連接到 事件 或將其指定為 回調

基本函數

函數定義包含:

  • 函數的 範圍(全域或 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 = Workspace
print(firstPart.Parent) -- Workspace
firstPart.Destroy(firstPart)
print(firstPart.Parent) -- nil
-- 使用冒號表示法(方法)銷毀一個部件
local secondPart = Instance.new("Part")
secondPart.Parent = Workspace
print(secondPart.Parent) -- Workspace
secondPart: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 中,回調是指寫入式函數成員,回調將暫停直到它們返回。廣泛使用的回調包括:

要設置回調,將一個函數分配給它。例如,BindableFunction.OnInvokeBindableFunction 的一個回調。您可以將命名或 匿名 函數設置為它,您可以通過調用回調的 :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)

匿名函數

您可以創建沒有名稱的函數,稱為 匿名函數,用作 回調事件處理程序。與命名函數一樣,匿名函數需要以 functionend 關鍵字開始和結束,但您不需要使用 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 = 4
print(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
©2026 Roblox Corporation、Roblox、Roblox 標誌及 Powering Imagination 是我們在美國及其他國家地區的部分註冊與未註冊商標。