Lua函数max8执行报错,请求问题排查及修复方案
Lua报错排查:attempt to call a number value (global 'max2')
报错原因
核心问题是全局变量污染:你在max4函数里执行max2 = max2(c,d)时,没有添加local关键字,导致全局作用域中原本作为函数的max2被覆盖成了一个数值。当max8调用两次max4时,第一次调用max4就已经把全局max2函数替换成了数值,第二次调用max4时再执行max2(c,d),就变成了尝试调用一个数值,直接触发报错。
单独调用max4时不会报错,是因为第一次执行max4时,全局max2还是函数,能正常完成调用;但调用结束后全局max2已经被改成数值,只是没有后续调用所以没暴露问题。
修复方案
有两种简单的修复方式:
方式1:给临时变量添加local关键字
通过local将临时变量限制在函数作用域内,避免污染全局变量:
function max2(a, b) if a > b then return a else return b end end function max4(a,b,c,d) local max1 = max2(a,b) local max2 = max2(c,d) -- 用local限制作用域,不会覆盖全局函数 if(max2 < max1) then return max1 else return max2 end end function max8(a,b,c,d,e,f,g,h) local max1 = max4(a,b,c,d) local max2 = max4(e,f,g,h) if(max2 < max1) then return max1 else return max2 end end print("test max8",max8(8,9,7,4,5,28,1,2))
方式2:修改临时变量名,避免与函数名冲突
把临时变量换成和函数名不同的名称,彻底避免覆盖问题:
function max2(a, b) if a > b then return a else return b end end function max4(a,b,c,d) local max1 = max2(a,b) local max_right = max2(c,d) -- 换名避免和max2函数冲突 if(max_right < max1) then return max1 else return max_right end end function max8(a,b,c,d,e,f,g,h) local max_left = max4(a,b,c,d) local max_right = max4(e,f,g,h) if(max_right < max_left) then return max_left else return max_right end end print("test max8",max8(8,9,7,4,5,28,1,2))
内容的提问来源于stack exchange,提问作者AdaLovee
相关产品推荐
相关产品推荐

