函數 是 個代碼塊 你可以在指令上執行多次。你也可以連接牠們到 事件 或指定牠們作為 0> 回歸式呼叫方式0>。
基本功能
功能定義包括:
- 功能的 範圍 (全球或 local )。
- Function 關鍵字。
- 在 camelCase 中功能的名稱。
- 參數在括號中( >)。
- 功能的代碼區塊,也稱「bod身體」。
- 結束nd 關鍵字。
函數的體體在你呼叫函數時執行。要呼叫函數,請輸入其名稱,並在此輸入漆括。你可以定義變數來接受返回值,或使用返回值作為變數。
-- 此功能沒有參數和返回 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 關鍵字跟隨 1> retur傳回1> 語句,因
-- 此功能返回一個返回值
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 ) 作為第一個參引數。當您呼叫方法時,使用 2> ( 5> )2> 而不是 dot 記號 ( 8> )8> 來傳達 1> self
Roblox 中的所有對象都從 Instance 下降,包括常常使用的方法,例如 Instance:Destroy() 、 Instance:Clone() 和 2>Class.Instance:FindFirstChild2> 。
-- 使用 dot 符號摧毀零件(功能)local firstPart = Instance.new("Part")firstPart.Parent = workspaceprint(firstPart.Parent) -- 工作區域firstPart.Destroy(firstPart)print(firstPart.Parent) -- 零-- 使用 colon 標記摧毀零件(方法)local secondPart = Instance.new("Part")secondPart.Parent = workspaceprint(secondPart.Parent) -- 工作區域secondPart:Destroy()print(secondPart.Parent) -- nil
定義方法
要在桌子中創建方法,請使用方法名稱作為鑰匙,方法函數作為值。在方法定義中, self 參數指向方法的父表。當您使用桿號碼來呼叫方法時,您將表自身作為第一引數參數傳送。您可以為方法定義參數,但您需要在 self 參數後列出它
在下面的例子中, testButton 表有一個方法作為值的 changeEnabled 鍵匙。您可以檢查到 self 指向方法的父表,並且列出 2> self.enabled2> 的值。
local testButton = {
enabled = true,
changeEnabled = function(self, isEnabled)
self.enabled = isEnabled
print(self.enabled)
end
}
print(testButton.enabled) -- 真的
-- 呼叫方法
testButton:changeEnabled(false) -- false
回調
回調是可以在其他函數或程序執行時執行的函數。
基本回撥
可以將功能傳入其他功能,例如,匿名功能可以用來實現一個回潮,然後使用table.sort()來排序一個列表Players 從2> Class.Players.GetPlayers()2>。
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的回調。您可以將名稱為 Class.Bind
local bindableFunction = Instance.new("BindableFunction")
bindableFunction.OnInvoke = function(number)
return 2 * number
end
print(bindableFunction:Invoke(42)) -- 84
功能技術
事件處理器
您可以為事件發生時執行的函數,也就是「<a href="/luau/reference/engine/databases/ database_name#event_handler」,來指定執行時間。例如,您可以在 <a href="/reference/engine/databases/ database_name.md#event_handler" target="_playerAdded" target="_playerAdded" target="_playerAdded" target="_playerAdded" target="_playerAdded" target="_playerAdded" target="_playerAdded" target="<p>在</p> <p>在</p> <p
local Players = game:GetService("Players")
local function onPlayerAdded(player)
print(player.Name .. " joined the game!")
end
Players.PlayerAdded:Connect(onPlayerAdded)
匿名函數
您可以無需名稱地創建功能,例如 匿名功能 ,以便作為 呼叫 和 事件處理器 使用。像名稱功能一樣,匿名功能需要以 2>function2> 和 5>en結束5> 的關鍵字開
在下面的例子中, task.delay() 函數的回調和 Players.PlayerAdded 事件的手處器都是匿名的。
-- 在 task.延遲() 的函數中的匿名函數
task.delay(2, function(exactTimeElapsed)
print(exactTimeElapsed) -- 2.0064592329944
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 = 4print(string.format("The %s is a %s!", "cake", "lie")) -- 蛋糕是個謊言!print(string.char(115, 101, 99, 114, 101, 116)) -- secret
定義變體函數
要定義變體函數,您使用 ... 代表最後或只有一個參數 (不要與 .. 、結合 操作器 )來定義。您可以將 2>...2> 值放入表中以便使用。
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