Как получить 'self' из функции обработчика событий Lua? - PullRequest
1 голос
/ 08 ноября 2019
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
functin 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 ?

Если нет,как я должен проектировать?


[решено] Я использовал переводчик, но я хочу быть вежливым. Спасибо за хорошие ответы.

Ответы [ 2 ]

2 голосов
/ 08 ноября 2019

Один из способов избежать ненужной работы - написать функцию, которая обернет ее для вас, прежде чем зарегистрировать ее в качестве обработчика:

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 голосов
/ 08 ноября 2019

Просто используйте анонимную функцию, которая вызывает фактическую функцию

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