函數

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

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

基本函數

函數定義包括:

  • 函數的範圍:全域或 local(或 const 用於無法重新指派名稱的本地函數)。
  • 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 期望 end 關鍵字跟隨 return 語句,因此在 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 的列表進行排序,該列表來自 Players.GetPlayers()

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("前 5 個平方數是:", unpack(squares))
-- 前 5 個平方數是 1 4 9 16 25
©2026 Roblox Corporation、Roblox、Roblox 標誌及 Powering Imagination 是我們在美國及其他國家地區的部分註冊與未註冊商標。