可变参数函数(...)
本课属于 Coddy Lua 学习旅程的“逻辑与流程”单元。第 11 课,共 54 课。
有时,你需要一个可以处理任意数量参数的函数。也许你想计算两个、三个或十个数的和,而不必为每种情况分别编写函数。Lua 为此提供了一种特殊语法:三个点 ...
在函数的参数列表中放入 ...,它就会变成一个可接受任意数量参数的可变参数函数:
function sum(...)
-- 函数体
end在函数内部,你也可以再次使用 ... 来访问这些参数。为了更方便地处理它们,你可以用花括号将它们打包到一个表中:
function sum(...)
local args = {...}
local total = 0
for i = 1, #args do
total = total + args[i]
end
return total
end
print(sum(5, 10, 15)) -- 输出:30
print(sum(1, 2, 3, 4, 5)) -- 输出:15表达式 {...} 会创建一个列表形式的表,其中包含传递给函数的所有参数。然后,你可以像遍历其他表一样遍历它,使用长度运算符 # 或 ipairs()。
只要没有参数是 nil,这种方法就有效。nil 会在表中留下空缺,而 # 在表中存在空缺时并不可靠。select("#", ...) 始终会返回参数的数量,包括值为 nil 的参数:
function countArgs(...)
return select("#", ...)
end
print(countArgs(10, 20, 30)) -- 输出:3
print(countArgs(10, nil, 30, nil)) -- 输出:4挑战
简单编写一个函数 calculateAverage,接受任意数量的数值参数,并返回它们的平均值。
使用可变参数语法 ... 接受数量灵活的参数,将它们打包到一个表中,计算它们的总和,再除以参数数量。
注意:起始代码(标记为 "Don't touch this code")会从输入中读取数字,将每个数字从文本转换为数值(使用 tonumber()),并将它们存储在名为 numbers 的表中。最后,它会使用 unpack(numbers) 调用你的函数,将表中的值逐个作为参数传入,因此你的函数会通过 ... 接收这些参数。你不需要修改或详细理解这段代码,只需专注于编写 calculateAverage。
逻辑:
- 使用
{...}将所有参数打包到一个表中 - 遍历该表,计算所有数字的总和
- 将总和除以参数数量,得到平均值
- 以数值形式返回平均值
参数:
...(数字):数量可变的数值参数
返回值:所有给定数字的平均值(数值)
亲手试试
-- 不要修改这段代码 --
local numbers = {}
while true do
local input = io.read()
if input == nil or input == "" then
break
end
local num = tonumber(input)
if num then
table.insert(numbers, num)
end
end
-------------------------
function calculateAverage(...)
-- 在这里编写代码
end
这节课包含一个小测验。开始学习即可作答,并记录你的进度。
逻辑与流程中的所有课
自己练习: Lua 在线编译器