功能

*此內容是使用 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) -- attempt to perform arithmetic (add) on number and 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)作為第一個引數數。當您呼叫方法時,使用殖寫符號()而不是點符號()來自動傳輸 》 作為第一個參數。

Roblox 中所有對象都從 Instance 下降,並擁有常用的方法,包括 Instance:Destroy()Instance:Clone()Instance:FindFirstChild()


local Workspace = game:GetService("Workspace")
-- 使用點號符號摧毀零件(功能)
local firstPart = Instance.new("Part")
firstPart.Parent = Workspace
print(firstPart.Parent) -- 工作區
firstPart.Destroy(firstPart)
print(firstPart.Parent) -- 無
-- 使用殖夷符號摧毀零件(方法)
local secondPart = Instance.new("Part")
secondPart.Parent = Workspace
print(secondPart.Parent) -- 工作區
secondPart:Destroy()
print(secondPart.Parent) -- nil

定義方法

要在表中創建一個方法,請使用方法名稱作為鑰匙,並使用方法功能作為值。在方法定義中,self參數指的是方法的父表。當您使用殖號記號呼叫方法時,您傳送表本身作為第一引數參數。您可以為方法定義參數,但必須在 self 參數後列出它們。

在下面的例子中,testButton 表有一個方法作為 changeEnabled 鍵的值。您可以通過輸出 self 值來確認 self.enabled 引用方法的父表。


local testButton = {
enabled = true,
changeEnabled = function(self, isEnabled)
self.enabled = isEnabled
print(self.enabled)
end
}
print(testButton.enabled) -- 真的
-- 呼叫方法
testButton:changeEnabled(false) -- false

呼叫回來

回稱是在回應另一個功能或過程時執行的功能。

基本回呼

功能可以傳給其他功能,例如,匿名功能可以用來實現一個回調,table.sort()它來排序一個列表的PlayersPlayers.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()


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 .. " joined the game!")
end
Players.PlayerAdded:Connect(onPlayerAdded)

匿名功能

您可以創建沒有名稱的函數,稱為 匿名函數 ,用作 回調 和 事件處理器 。像命名的函數一樣,匿名函數需要以 functionend 關鍵字開始和結束,但你不需要 local 關鍵字來指示本地範圍,因為它們總是有本地範圍。

在下面的例子中,task.delay() 函數的回呼和Players.PlayerAdded事件處理器都是匿名函數。


-- 回應任務.delay()的匿名函數
task.delay(2, function(exactTimeElapsed)
print(exactTimeElapsed) -- 2.0064592329945
end)
-- 事件處理器中的匿名功能
local Players = game:GetService("Players")
Players.PlayerAdded:Connect(function(player)
print(player.Name .. " joined the game!")
end)

模組腳本的功能

您可以將功能存儲在 ModuleScripts 中,以便在多個腳本中重複使用。功能是 Luau 數據輸入,因此您可以將它們存儲在其他數據中的表中。

變異功能

變體函數接受任何數量的參數。例如, Globals.LuaGlobals.print() 是一個變體函數。


print(2, "+", 2, "=", 2 + 2) --2 + 2 = 4
print(string.format("The %s is a %s!", "cake", "lie")) -- 蛋糕是個謊言!
print(string.char(115, 101, 99, 114, 101, 116)) -- secret

定義變異功能

若要定義變異功能,您使用 ... 代幣作為最後或唯一的參數 (不要與 .. 混淆,連接符 操作器 )。您可以將 ... 值放入表中,以方便使用。


local function variadic(named, ...)
local arguments = {...} -- 將額外參數包裝到表中
print("Named argument =", named)
for i, value in arguments do
print("Input No.", i, "=", value)
end
end
variadic(10, "Hi", 20, "Variadic Function")
--[[ 結果輸出:
Named argument = 10
Input No. 1 = Hi
Input No. 2 = 20
Input No. 3 = Variadic Function
]]

向前參數

您可以定義變異函數作為其他函數的包裝來傳特權證或向其他函數傳遞從包裝到其他函數的參數。


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)
--[[ 結果輸出:
Before
x = 1
y + z = 5
After
]]

使用陣列呼叫變異功能

如果您想將一個值表陣列傳給全球變量函數,例如 print(),您可以使用全球 unpack() 函數來傳送表的值而不是表本身。


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