Lua开发Discord API包装器遇Message类调用错误求助
这个错误Attempt to call upvalue 'Message' (a table value)本质是你在Interaction模块里把一个普通表当成函数(类构造器)来调用了,结合你用rxi's classic实现类的场景,核心问题出在Message类的定义/引用/实例化流程上,给你几个具体排查方向:
1. 确认Message类的定义符合classic规范
打开你的Message模块文件,确保类是通过classic的继承语法定义的:
local Object = require('classic') local Message = Object:extend() -- 类的方法定义... return Message
如果Message只是普通的table(比如直接local Message = {}),没有通过Object:extend()创建,那它就不具备可调用的构造器,调用Message()自然会报错。
2. 检查Interaction模块对Message的引用是否正确
在Interaction模块里,你引用Message的代码必须是拿到类本身,而不是某个实例或普通表:
- 确认require路径正确:比如如果Message模块在
discord/message.lua,那应该写local Message = require('discord.message'),路径错误可能会加载到无关的table。 - 检查是否误将Message重新赋值:比如有没有在模块里写过
Message = some_other_table,覆盖了原本的类引用。
3. 排查实例化代码的写法
classic创建实例支持Message()或Message{}两种写法,但前提是Message是合法的classic类。如果你的代码是类似local msg = Message(data),但此时Message是普通table,就会触发这个错误。另外要注意:如果是循环依赖导致Message在加载时还没成为类(比如Interaction和Message互相require),可以把require语句放到需要创建实例的函数内部,避免模块加载时的未定义问题。
4. 验证模块加载顺序
确保在Interaction模块被加载之前,Message类已经完成定义并导出。如果存在循环依赖,比如Message里也引用了Interaction,建议把跨模块的引用延迟到函数调用时,而不是放在模块顶部。
内容的提问来源于stack exchange,提问作者HazardousDev

