功能

*此内容使用人工智能(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)作为第一个参数。当你调用方法时,使用撇号记号(:)而不是点记号(.)自动传递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.enabled 的值来验证 self 引用方法的父表。


local testButton = {
enabled = true,
changeEnabled = function(self, isEnabled)
self.enabled = isEnabled
print(self.enabled)
end
}
print(testButton.enabled) -- 真实
-- 调用方法
testButton:changeEnabled(false) -- false

回调

回调是在回应另一个函数或过程时执行的函数。

基本回调

函数可以传递到其他函数,例如,一个 匿名 函数可以用来实现一个回调,然后用于排序列表 从 。


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事件处理器都是匿名函数。


-- 回调到 task.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