可变参函数¶
Time:5 分钟
可变参函数(Variadic Function)与只能接收指定数量参数的常规函数不同,可以接收任意数量的参数。
库中的可变参函数¶
Lua 和 Roblox 的库中包括多个可变参函数。许多开发者都未意识到,我们所常用的 print()
函数就是十分典型的可变参函数。
代码
print(2, "+", 2, "=", 2+2)
print( string.format("The %s is a %s!", "cake", "lie") )
print( string.byte(115, 101, 99, 114, 101, 116) )
输出
2 + 2 = 4
The cake is a lie!
secret
可变参函数的使用¶
定义可变参函数时,开发者应当使用 ...
符号作为该函数的最后或唯一参数(请勿将其与两个句点构成的串联运算符 ..
混淆)。这个由三个句点构成的符号稍后可在该函数中作为变量集合使用。在大多数情况下,最为便利的做法是将所有实参都打包至表(table)中:
代码
local function variadic(named, ...)
local arguments = {...} -- 将额外参数打包至表中
print("Named argument = ", named)
for i, value in ipairs(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
同时,我们也可以运用此功能来编写 “sum”(总和)函数:
代码
function sum(...)
local sum = 0
for _, value in ipairs({...}) do
sum = sum + value
end
return sum
end
print( sum(1, 2, 3, 4) )
print( sum(9, 8, 7, 6, 5, 4, 3) )
输出
10
42
实参传递¶
此功能的另一个常见用法为对实参的传递。在以下示例中,假设开发者需要在调用函数前后分别进行打印(print):
local function printAround(func)
print("Before")
func()
print("After")
end
local function foo()
print("bar")
end
printAround(foo)
输出
Before
bar
After
当我们希望为 foo()
添加参数时,可以使用 ...
符号进行以下处理:
代码
local function printAround(func, ...)
print("Before")
func(...)
print("After")
end
local function foo(x, y, z)
print("x =", x)
print("y + z =", y + z)
end
printAround(foo, 1, 2, 3)
输出
Before
x = 1
y + z = 5
After