DRY:不要在 Lua 中重复自己

问题描述 投票:0回答:1

有没有办法不重写同一部分(循环

for i = 1...end
)两次?

local function myfunc(frame,method)
    if frame:IsShown() then
        for i = 1, #frame.buttons do
            frame.buttons[i]:HookScript("OnMouseDown", method)
        end
    else
        frame:SetScript(
            "OnShow",
            function(frame)
                for i = 1, #frame.buttons do
                    frame.buttons[i]:HookScript("OnMouseDown", method)
                end
            end
        )
    end
end

哪里

  • IsShown()
    HookScript()
    SetScript()
    都是游戏内API

编辑

也许是一个递归函数?似乎有效:

local function myfunc(frame,method)
    if frame:IsShown() then
        for i = 1, #frame.buttons do
            frame.buttons[i]:HookScript("OnMouseDown", method)
        end
    else
        frame:SetScript(
            "OnShow", --when "OnShow" is fired, IsShown() become true
            function()
                myfunc(frame,method)
            end
        )
    end
end
function lua dry world-of-warcraft
1个回答
0
投票

您可以将

for i = 1...end
部分提取为单独的函数。另外,由于我们讨论的是干净代码的主题,因此您还可以制作 if 块
return
。然后
else
代码块可以位于函数体内并解除一级嵌套。

local function hook(frame, method)
    for i = 1, #frame.buttons do
        frame.buttons[i]:HookScript("OnMouseDown", method)
    end
end

local function myfunc(frame, method)
    if frame:IsShown() then
        hook(frame, method)
        return
    end
    frame:SetScript(
        "OnShow",
        function(frame)
            hook(frame, method)
        end
    )
end
© www.soinside.com 2019 - 2024. All rights reserved.