Menu
CoddyTech

可变参数函数(...)

本课属于 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
challenge icon

挑战

简单

编写一个函数 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
quiz icon自我测试

这节课包含一个小测验。开始学习即可作答,并记录你的进度。

逻辑与流程中的所有课

自己练习: Lua 在线编译器