如何在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
相关产品推荐
相关产品推荐

