Lua函数参数传递机制及跨文件调用参数丢失问题咨询
Lua 参数传递异常:冒号方法调用的坑
嘿,这个问题我太熟了!本质是Lua里冒号和点号定义/调用方法的区别搞的鬼,我给你拆解清楚:
问题根源
你在DBC.lua里用:定义的方法是Lua的面向对象语法糖,它等价于:
function DBC.connectDevice(self, name, id, ptid) trace(name) trace(id) trace(ptid) end
也就是说,冒号会自动给方法添加第一个self参数,用来指向类/实例本身。
但你在index.lsp里调用时用了点号.:
dbc.connectDevice(name, id, ptid)
这时候Lua会把name当成第一个参数self,id变成方法里的name,ptid变成方法里的id,最后方法里的ptid自然就成了nil——这就是你看到输出错位的原因!
两种快速解决办法
1. 调用时改用冒号(推荐)
直接把点号换成冒号,Lua会自动把dbc作为self参数传进去,后面的参数就会完美对应:
dbc:connectDevice(name, id, ptid)
这样trace输出就会变成你预期的ESP 1 72893789了。
2. 手动传递self参数(不推荐,写法繁琐)
如果非要用点号调用,就得手动把dbc作为第一个参数传进去:
dbc.connectDevice(dbc, name, id, ptid)
额外建议:规范你的类写法
如果是把DBC作为类来使用,建议补全构造函数,用标准的Lua面向对象方式实现,避免后续踩更多坑:DBC.lua代码调整为:
-- 定义类 DBC = {} DBC.__index = DBC -- 构造函数 function DBC.new() local obj = {} setmetatable(obj, DBC) return obj end -- 类方法(用冒号) function DBC:connectDevice(name, id, ptid) trace(name) trace(id) trace(ptid) end
然后index.lsp里这样调用:
local DBC = dofile("/home/mako/www/.lua/DBC.lua") -- 先实例化对象 local dbc = DBC.new() -- 用冒号调用方法 dbc:connectDevice(name, id, ptid)
内容的提问来源于stack exchange,提问作者prix
相关产品推荐
相关产品推荐

