位置:首页 > Lua > Lua中三个点...的作用:可变参数函数用法详解

Lua中三个点...的作用:可变参数函数用法详解

时间:2026-08-15  |  作者:深海捕梦者  |  阅读:0

一、基础:... 表达式

在函数的参数列表中,... 被用作最后一个参数。

它表示该函数可以接受任意数量的额外参数。

Lua中的三个点(...):解锁函数参数的无限可能
            <!----></a> <!---->

function sum(...)
    -- 1. 将所有可变参数打包到一个名为 'args' 的 table 中
    local args = { ... }
    local total = 0

    -- 2. 像遍历普通 table 一样遍历参数
    for i, v in ipairs(args) do
        total = total + v
    end

    return total
end

print(sum(1, 2, 3))       -- 输出: 6
print(sum(10, 20, 30, 40)) -- 输出: 100
print(sum())              -- 输出: 0

解析:在函数内部,... 并不是一个变量。

它是一个表达式(Expression),代表所有传递给它的可变参数序列。

二、nil 的陷阱与专业工具

上面的 sum 函数看起来几乎没问题,但其实藏着一个容易忽略的坑。

只要参数里出现了 nil,解析就会在这里直接停住,后面那些参数也会一并丢失。

正因为如此,想把不定参数真正处理对,就得借助 select 和 table.pack 来完整解析。

local args = { 10, 20, nil, 40 }
-- ipairs(args) 在遇到 nil 后会停止
-- #args 的行为也可能不符合预期

1. select('#', ...):获取参数的真实数量

select 函数是一个强大的内建工具。

当它的第一个参数是字符串 '#' 时,会返回传递给它的可变参数的确切数量,无视 nil。

function count_args(...)
    -- 这才是获取可变参数数量的最可靠方法
    local arg_count = select('#', ...)
    return arg_count
end

print(count_args(1, "hello", nil, true)) -- 输出: 4

2. table.pack(...):安全地打包参数

从 Lua 5.2 起,官方给出了一个更稳妥的打包方案:table.pack。

它的作用和前者一样,都是把所有参数收进一个 table 里。

不同的是,它会额外带上一个 n 字段。

这个字段用来记录参数的实际个数,也就是 select('#', ...) 返回的结果。

function safe_sum(...)
    -- 使用 table.pack 进行安全打包
    local args = table.pack(...)
    local total = 0

    -- 使用 args.n 来进行安全的循环,而不是 ipairs
    for i = 1, args.n do
        local v = args[i]
        print(v) -- 打印每个参数以进行调试
        -- 确保我们只对数字进行相加
        if type(v) == "number" then
            total = total + v
        end
    end
    return total
end

print(safe_sum(1, 2, nil, 4)) -- 输出: 7 (nil 被安全地跳过了)

结语

点个赞,关注我获取更多实用 Lua 技术干货!如果觉得有用,记得收藏本文!

免责声明:文中图文均来自网络,如有侵权请联系删除,心愿游戏发布此文仅为传递信息,不代表心愿游戏认同其观点或证实其描述。

相关文章

更多

精选合集

更多

大家都在玩

热门话题

大家都在看

更多