如何将表中的方法存储到另一表中?Lua 5.4报错问题排查
问题分析与解决
首先你的代码存在拼写错误:functionsStore:funcA应为functionStore:funcA,但这不是核心报错原因。
核心问题在于:Lua中:是语法糖,obj:method()等价于obj.method(obj),所以当你写functionStore:funcA时,Lua会将其解析为函数调用(:暗示需要传入self参数),但你未加括号,因此触发function arguments expected near '}'错误。
要将表的方法存入新表,有两种常用实现方式:
方式一:直接存储函数本体,调用时手动传入self
用.访问表的方法(这是获取函数对象的正确方式),调用时将原表作为第一个参数传入:
local functionStore = {} function functionStore:funcA() print("A") end -- 用.获取函数对象存入表 functionTable = {functionStore.funcA} -- 调用时手动传入self functionTable[1](functionStore)
方式二:存储绑定self的闭包
如果不想每次调用都传self,可以将方法包装为闭包,自动绑定原表作为self:
local functionStore = {} function functionStore:funcA() print("A") end -- 存闭包,自动绑定self functionTable = { function() functionStore:funcA() end } -- 直接调用即可 functionTable[1]()
两种方式的适用场景:
- 方式一更灵活,适合后续需要更换不同self对象调用同一方法的场景。
- 方式二更直观,调用时无需额外传参,适合固定绑定原表的场景。
如果要实现随机调用需求,可结合math.random:
-- 假设functionTable内有多个方法 local randomIndex = math.random(#functionTable) -- 对应方式一的调用 functionTable[randomIndex](functionStore) -- 对应方式二的调用 functionTable[randomIndex]()
内容的提问来源于stack exchange,提问作者Timtico
相关产品推荐
相关产品推荐

