You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何区分Lua函数参数被省略与显式传入nil的情况?

解决方案

Lua里未传入的参数会默认设为nil,显式传入nil时参数值也是nil,所以要区分这两种场景,得靠实际传入的参数数量来判断——用select('#', ...)函数就能获取调用时的参数总数,以此区分是否显式传了第二个参数。

修改后的override函数代码如下:

function override(overrideFlag, bool)
    -- 判断是否显式传入了bool参数
    local hasBoolArg = select('#', ...) >= 2

    if hasBoolArg then
        -- 显式传了bool(包括nil),执行原布尔转换逻辑
        bool = bool and true or false
    else
        -- 没传bool参数,取当前boolOverride的反值
        bool = not boolOverride
    end

    if overrideFlag then
        boolOverride = bool
    else
        boolOverride = nil
    end
end

关键逻辑说明

  • select('#', ...)返回调用函数时实际传入的参数个数:
    • 调用override(true)时,参数个数是1,进入else分支,bool被设为not boolOverride
    • 调用override(true, nil)时,参数个数是2,进入if分支,bool被转换为false
    • 调用override(true, 0)或override(true, 'hello')这类非布尔值时,同样进入if分支,转换成标准布尔值
  • 保留原函数核心逻辑:overrideFlag为真时设置覆盖值,否则清除覆盖

测试示例

boolOverride = true

-- 未传bool参数,bool = not boolOverride → false
override(true)
print(boolOverride) -- 输出 false

-- 显式传nil,bool = nil and true or false → false
override(true, nil)
print(boolOverride) -- 输出 false

-- 显式传true,转换后仍为true
override(true, true)
print(boolOverride) -- 输出 true

-- 取消覆盖
override(false)
print(boolOverride) -- 输出 nil

内容的提问来源于stack exchange,提问作者Choosechee

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.12 14:53:16