Lua 多返回值:校验分钟数并返回错误原因
限制数字文本长度与字符,再转换和验证范围,使用数值与错误说明两个返回值表达清晰结果。
本节目标
限制数字文本长度与字符,再转换和验证范围,使用数值与错误说明两个返回值表达清晰结果。
环境与运行方法
使用 Lua 5.4 或更新版本。保存为 lesson.lua,运行 lua lesson.lua。只使用标准功能,不需要游戏引擎或外部模块。
核心思路
tonumber 的接受规则可能宽于业务协议。本例只接受一到四位十进制数字文本,不接受符号、小数或空白。失败使用 nil 与原因,而不以零代替。
完整示例
local function minutes(text)
if type(text) ~= "string" or #text < 1 or #text > 4 or not text:match("^%d+$") then
return nil, "format"
end
local value = tonumber(text)
if value > 1440 then return nil, "range" end
return value, nil
end
for _, text in ipairs({"30", "0", "bad", "1441"}) do
local value, reason = minutes(text)
if value == nil then print("error=" .. reason)
else print("ok=" .. value) end
end预期输出
ok=30
ok=0
error=format
error=range逐步理解
短路逻辑先检查类型,之后才能安全求长度和匹配。Lua 模式中的 %d 表达数字,不是所有正则方言都通用的写法。格式通过后数值很小,可以直接比较业务上限。
两个返回值让调用者同时获得结果和原因,不需要全局错误变量。这里统一拒绝没有定义的表示形式,如五位的 00000,即使数值上为零,也违反长度约束。
常见问题与边界
- Lua 模式与常见正则语法不完全一致。
- 只接收一个返回值会丢失原因。
- 格式验证不能代替范围验证。
动手练习
测试 "0000"、"-1" 和 "1440"。
参考答案
四个零得到合法零,负号触发格式错误,1440 合法。若需要支持其他形式,应修改契约并补充测试。
文章回复
0 条公开回复