【问题标题】:How to get 'self' from Lua event handler function?如何从 Lua 事件处理函数中获取“自我”?
【发布时间】:2020-03-05 06:27:49
【问题描述】:
local tbl = {a = 1}

-- Passed and executed function
function tbl:handleFunc(x, y)
    print(self.a + x + y)
end

-- I know the above code is syntax sugar.
-- tbl["handleFunc"] = function(self, x, y)
--     print(self.a + x + y)
-- end

-- Register event handlers that I can't control the call
Frame:SetScript("OnClick", tbl.handleFunc)

-- Probably called when an event occurs.
tbl.handleFunc(2, 3)

-- Then it will be like this.
tbl.handleFunc(2, 3, nil)

-- So I wrote a function like this
function tbl.handleFunc(x, y)
    local self = tbl  -- This variable is too cumbersome
    -- And this way, every time I call a function, I need to check whether the function definition is a dot (.) Or colon (:)

end

在调用函数时,在不能传递self的情况下,有没有办法使用self

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


[已解决] 我使用了翻译器,但我想保持礼貌。谢谢你的好答案。

【问题讨论】:

    标签: lua add-on world-of-warcraft


    【解决方案1】:

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

    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))
    

    【讨论】:

      【解决方案2】:

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

      Frame:SetScript("OnClick", function(x,y) tbl:handleFunc(x, y) end)
      

      【讨论】:

        猜你喜欢
        • 2017-09-11
        • 1970-01-01
        • 1970-01-01
        • 2018-08-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-05-06
        • 1970-01-01
        相关资源
        最近更新 更多