You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.02 03:25:25