Lua中如何将对象/表的函数保存到变量并调用?
Lua面向对象中保存对象方法到变量的正确方式
问题原因
Lua里用:定义的方法是语法糖,等价于用.定义并将调用者作为第一个参数self传入。当你通过object1.PrintString直接获取函数引用时,并没有绑定对应的对象作为self,调用时自然没有这个参数,导致self为nil报错。
解决方案
1. 手动传入self
调用保存的函数时,主动把对象作为第一个参数传入:
funct2_object1 = object1.PrintString funct2_object1(object1) -- 正常输出 Default
2. 用匿名函数包装(推荐用于库函数传参)
如果要把方法传给第三方库(比如你提到的GUI:AddEventHandler),用匿名函数把对象和方法绑定,调用时会自动带上self:
-- 保存方法到变量 funct2_object1 = function() object1:PrintString() end funct2_object1() -- 正常输出 Default -- 直接传给库函数的写法 GUI:AddButton(...) :AddEventHandler(event, function() object1:PrintString() end)
3. 实现通用的bind函数
如果需要频繁绑定对象和方法,可以写一个通用工具函数,返回绑定了self的闭包:
function bind(obj, method) return function(...) return method(obj, ...) end end -- 使用方式 funct2_object1 = bind(object1, object1.PrintString) funct2_object1() -- 正常输出 Default
补充说明
你之前尝试的funct2_object1 = object1:PrintString()是错误写法,因为object1:PrintString()会直接执行方法,把返回值(此处为nil)赋值给变量,自然无法调用。
内容的提问来源于stack exchange,提问作者skrovno_CZ
相关产品推荐
相关产品推荐

