有没有办法不重写同一部分(循环
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
您可以将
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