You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Lua代码中遵循DRY原则,避免重复编写for循环逻辑?

如何避免重复编写Lua循环代码段?

原代码中,for i = 1, #frame.buttons do的循环逻辑在if和else分支里重复出现,我们可以通过以下几种方式优化:

方案一:抽取重复逻辑为独立辅助函数

把重复的循环逻辑封装成单独的函数,两个分支直接调用即可,代码更简洁易维护:

-- 封装重复的按钮钩子逻辑
local function hookButtons(buttons, method)
    for i = 1, #buttons do
        buttons[i]:HookScript("OnMouseDown", method)
    end
end

local function myfunc(frame, method)
    if frame:IsShown() then
        hookButtons(frame.buttons, method)
    else
        frame:SetScript("OnShow", function()
            hookButtons(frame.buttons, method)
            -- 可选:如果只需要执行一次,触发后移除OnShow脚本
            frame:SetScript("OnShow", nil)
        end)
    end
end

方案二:递归调用自身(你提到的可行方案)

利用OnShow触发后frame:IsShown()会变为true的特性,递归调用myfunc执行循环逻辑:

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()
            myfunc(frame, method)
            -- 可选:执行完后移除脚本,避免后续重复触发
            frame:SetScript("OnShow", nil)
        end)
    end
end

两种方案对比

  • 辅助函数方案逻辑拆分清晰,可读性更强,后续修改循环逻辑只需改一处,维护成本更低;
  • 递归方案代码量稍少,但可读性略弱,适合简单场景,记得按需移除OnShow脚本防止重复执行。

内容的提问来源于stack exchange,提问作者user3204810

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.02 19:02:36