模块文件末尾漏写 return,require 返回的是 true(文件执行成功的标记)而不是数据——调用方拿 true 当表用,取字段报 attempt to index a number value。另一类错误是模块顶层直接执行重初始化(读配置、连数据),两次 require 时机不同拿到半成品表,字段一半 nil。错误场景:
local guild = require("guild_mod")
guild.members()
guild_mod.lua 末尾没有 return,guild 是 true,报错信息让学员一头雾水。
模块统一返回一张本地表 M,重活收进 M.init() 由入口显式调用,加载与初始化解耦。攻城模块拆成配置、结算、播报三个文件,统一表返回。示例代码如下:
local M = {}
M.cfg = { siegeGold = 800000, taxRate = 5 }
function M.init()
sendmsg(nil, 1, "攻城模块初始化完成,税率 " .. M.cfg.taxRate .. "%")
end
function M.settle(winGuild)
sendmsg(nil, 1, winGuild .. " 攻占沙巴克,缴获 " .. M.cfg.siegeGold .. " 金币")
end
return M
调用方 require 拿到 M 表,init 时机由入口控制,重复 require 只执行一次文件体、共享同一张 M。示例代码如下:
local siege = require("siege_mod")
siege.init()
siege.settle("兄弟情深")
两行完成初始化与结算,文件体零副作用。
三步验证:注释掉 return 行,观察 require 返回 true 与后续报错;两个脚本各自 require 同一模块,修改 M.cfg 后互相可见(同一张表);把 init 里的输出挪到文件顶层,对比两次加载时机差异。
模块也可以返回函数(工厂形态):每次调用返回独立实例,适合多副本各自持有一份计数器的场景。示例代码如下:
return function(start)
local n = start or 0
return function()
n = n + 1
return n
end
end
工厂每次调用生成新闭包,两份计数器互不干扰,与共享单例的 M 表形成两极。
全站技术干货持续更新:996 引擎 / Lua 实战帖,语法、参数与示例一篇讲透。进入文章地图 · 查看全部 →
设计初衷 帮会活动只有攻城与聚餐两板斧:非攻城日帮会频道冷清,成员缺乏共同目标。帮会试炼场设计:帮会自有试炼场(限时挑战波次…
设计初衷 帮会资金靠少数大佬捐献:金主一走帮会资金断崖,普通成员没有参与感也不会珍惜帮会资源。帮会会费设计:成员按职位每周缴…
设计初衷 帮会扩张靠熟人拉人:增长有天花板、新人质量参差、老人不愿带新。募兵编制设计:帮会发布募兵任务包(新人完成入帮任务即…
底层原理 协程体内出错时 resume 返回 ok=false 与错误对象,但协程体若死循环则 resume 永久挂起——错…
底层原理 coroutine.resume 的实参会在协程内成为首个 yield 的返回值;coroutine.yield …
业务场景 挂摊卖药每小时断货:玩家下线前上满货,两小时后摊位空转。摊位自动补货封装:上摊时设定补货仓库(背包或帮会仓),定时…