函数 是您可以在命令上多次执行的代码块。您还可以将它们连接到事件或将它们分配为回调。
基础功能
函数定义包括:
- 功能的 范围 (全球或 local )。
- Function 关键字。
- 在 camelCase 中功能的名称。
- 在父级参数 ( () ) 中的参数。
- 功能的代验证码块,或称“身体ody”。
- 结束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 声明后,写代码在 2>回传eturn2> 声明之前。
-- 此函数返回一个返回值
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 ) 作为第一个参数。当您调用方法时,请使用“1> :1>” 而不是“4> :4>” 来传递 7> self7> 作为第一个参
Roblox 中的所有对象都从 Instance 下降,具有常用方法包括 Instance:Destroy()、Instance:Clone() 和 2>Class.Instance:FindFirstChild()2>。
-- 使用 dot 符号摧毁零件 (功能)local firstPart = Instance.new("Part")firstPart.Parent = workspaceprint(firstPart.Parent) -- 工作区firstPart.Destroy(firstPart)print(firstPart.Parent) -- 无-- 使用“:”号称号摧毁零件(方法)local secondPart = Instance.new("Part")secondPart.Parent = workspaceprint(secondPart.Parent) -- 工作区secondPart:Destroy()print(secondPart.Parent) -- nil
定义方法
要在表中创建方法,请使用方法的名称作为钥匙,方法函数作为值。在方法的定义中,self 参数指向方法的父表。当您使用 colon 标记调用方法时,您将表自身作为第一个参数传递给方法。您可以为方法定义参数,但您需要在 self 参数后列出它们。
在下面的例子中,testButton 表有一个方法作为值的 changeEnabled 键。您可以验证 self 指向父表的方法的值,打印 1> self.enabled1> 的值。
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 的回调。您可以将名称或 匿名
local bindableFunction = Instance.new("BindableFunction")
bindableFunction.OnInvoke = function(number)
return 2 * number
end
print(bindableFunction:Invoke(42)) -- 84
功能技术
事件处理器
您可以将一个函数,称为事件处理器,分配到事件发生时执行。例如,您可以创建一个名为onPlayerAdded() 的函数,将打印在Players.PlayerAdded 事件上打印的玩家名称。 了解更多信息,请参阅2>事件2>。
local Players = game:GetService("Players")
local function onPlayerAdded(player)
print(player.Name .. " joined the game!")
end
Players.PlayerAdded:Connect(onPlayerAdded)
匿名函数
您可以创建无名函数,例如 匿名函数 ,作为 调用 和 事件处理器 。 与命名函数一样,匿名函数需要以 2>function2> 和 5>end5> 键词开始和结束,但您不需要 8>local
在下面的例子中,task.delay()函数的回调和Players.PlayerAdded事件的处理器都是匿名函数。
-- 在 task.延迟() 的调用中的匿名函数
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 = 4print(string.format("The %s is a %s!", "cake", "lie")) -- 蛋糕是个谎言!print(string.char(115, 101, 99, 114, 101, 116)) -- secret
定义变体函数
要定义一个变体函数,您使用 ... 代币作为最后或唯一的参数 (不要与 .. 、 concatenation 操作器 混淆)。您可以将 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(),您可以使用 global 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