Lua中函数定义:与.的区别及调用参数nil报错原因解析
Lua中冒号(:)与点(.)定义函数的区别及报错原因解析
报错原因
你用Object.keys(t)调用时出现参数table为nil的报错,核心原因是冒号定义的函数会自动添加self参数:
你写的function Object:keys(table),Lua会自动转换成等价的function Object.keys(self, table)。当你用.调用时,传入的t会被当作第一个参数self,而原本的table参数就没有值了,自然变成nil,导致pairs(table)因为传入nil报错。
而用object:keys(table)调用时,Lua会自动把object作为self参数传入,后面的table参数正常对应,所以能正确执行。
冒号(:)与点(.)定义函数的核心区别
用
.定义函数:函数的参数完全是你显式声明的内容,调用时必须传入所有声明的参数。比如:function Object.keys(table) -- 逻辑代码 end调用时直接传
Object.keys(t)即可,参数一一对应。用
:定义函数:Lua会自动在参数列表最前面插入一个self参数,这个参数代表调用该方法的对象实例。调用时如果用:,Lua会自动把调用者作为self传入;如果用.调用,就需要手动传入self参数,否则会出现参数错位。
针对你的代码的修复建议
因为你的keys方法其实不需要用到self(没有访问对象的属性或方法),所以更适合改成.定义:
function Object.keys(table) local keyset={} local n=0 for k,v in pairs(table) do n=n+1 keyset[n]=k end return keyset end
这样不管用Object.keys(t)还是实例调用(object.keys(t))都能正常工作。
内容的提问来源于stack exchange,提问作者5242 Bora
相关产品推荐
相关产品推荐

