给Lua math库添加自定义Round函数时遇nil值索引错误求助
问题解决:给Lua的math库添加自定义Round函数
错误原因
你遇到的报错是因为给math设置的元表是空表{},这个空表中不存在__index字段,所以mt.__index的值是nil,尝试对nil进行索引赋值自然会抛出错误。
解决方案
方案1:直接挂载函数到math表(最简单推荐)
math本身就是一个普通的全局表,不需要借助元表,直接把自定义函数挂载上去即可:
function math.Round(num, places) -- 处理places未传入的默认值 places = places or 0 local decimals = 10^places num = num * decimals -- 分别处理正负数值的四舍五入 if num >= 0 then return math.floor(num + 0.5) / decimals else return math.ceil(num - 0.5) / decimals end end -- 测试示例 print(math.Round(1.234, 2)) -- 输出 1.23 print(math.Round(1.236, 2)) -- 输出 1.24 print(math.Round(-1.234, 2)) -- 输出 -1.23
方案2:用元表实现(若坚持使用元表)
如果一定要通过元表方式扩展,需要确保元表的__index是一个有效的表(可以是math本身,也可以是单独的表):
-- 初始化元表时就指定__index指向math自身 local mt = {__index = math} debug.setmetatable(math, mt) -- 或者先设置空元表,再给__index赋值空表 -- debug.setmetatable(math, {}) -- local mt = getmetatable(math) -- mt.__index = {} function Round(num, places) places = places or 0 local decimals = 10^places num = num * decimals if num >= 0 then return math.floor(num + 0.5) / decimals else return math.ceil(num - 0.5) / decimals end end -- 给元表的__index表添加自定义函数 mt.__index.Round = Round -- 测试示例 print(math.Round(3.5)) -- 输出 4 print(math.Round(-3.5)) -- 输出 -4
原代码的额外问题修复
- 原代码中
local decimals = 10^places or 0逻辑错误:当places为nil时,10^nil会得到NaN,or 0无法修正,必须先给places设置默认值places = places or 0 - 原函数未处理负数情况,会导致负数输入时返回
nil,补充了else分支的负数四舍五入逻辑
内容的提问来源于stack exchange,提问作者Sink
相关产品推荐
相关产品推荐

