如何从 Lua 事件处理函数中获取'self'?

local tbl = {a = 1}

--传递并执行函数
function tbl:handleFunc(x, y)
    print(self.a + x + y)
end

--我知道以上代码是语法糖
--tbl["handleFunc"] = function(self, x, y)
--     print(self.a + x + y)
--end

--注册我无法控制调用的事件处理程序
Frame:SetScript("OnClick", tbl.handleFunc)

--可能在事件发生时调用
 tbl.handleFunc(2, 3)

--然后就会变成这样
 tbl.handleFunc(2, 3, nil)

--于是我写了这样的函数
function tbl.handleFunc(x, y)
    local self = tbl --这个变量太繁琐
    --而且这样,每次调用函数都需要检查函数定义是一个点(.)还是冒号(:)

end

在调用函数时,当你无法传递_self_时,是否有一种方法可以使用_self_?

如果没有,我应该如何设计?


[已解决]我使用了翻译软件但是我想表现得礼貌。谢谢你们的好回答。

点赞
用户2858170
用户2858170

只需要使用匿名函数调用实际的函数

Frame:SetScript("OnClick", function(x, y) tbl:handleFunc(x, y) end)
2019-11-08 15:46:09
用户4567755
用户4567755

一种避免不必要工作的方法是编写一个函数,在注册它作为处理程序之前为您包装函数:

local tbl = {a = 1}

function tbl:handleFunc(x, y)
    print(self.a + x + y)
end

function wrap_with(obj, func)
    return function(...)
        return func(obj, ...)
    end
end

Frame:SetScript("OnClick", wrap_with(tbl, tbl.handleFunc))
2019-11-08 15:47:00