如何区分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
相关产品推荐
相关产品推荐

