我正在创建我的第一个WoW插件,在我的研究中,我读到在WoW中创建的每一个帧都是全球性的,这确实让我感到困惑。
我见过很多只执行f=CreateFrame(.)的加载项,所以这些加载项不会一直相互冲突吗?
这可能有一个简单的解释,很抱歉,如果这个问题有点傻,但如果有人能为我澄清这一点,我会非常感激的
发布于 2022-06-10 01:27:52
从XML文件创建的每个帧都是全局的,因此可以从Lua文件访问它们。
## Interface: 90205
## Version: 1.0.0
## Title: Hello
hello.xml<Ui>
<Script file="hello.lua"/>
<Frame name="HelloWorldFrame"> <!-- global frame -->
<Scripts>
<OnLoad>
HelloWorld_OnLoad(self)
</OnLoad>
<OnEvent>
HelloWorld_OnEvent(self, event, ...)
</OnEvent>
</Scripts>
</Frame>
</Ui>function HelloWorld_OnLoad(self)
print("Loaded HelloWorldFrame")
self:RegisterEvent("CHAT_MSG_SAY")
end
function HelloWorld_OnEvent(self, event, ...)
print("Your character said something", event, ...)
end如果您只使用一个Lua文件并在那里创建您的框架,那么您不一定需要使它成为全局的。
local function OnEvent(self, event, ...)
print("Your character said something", event, ...)
end
local f = CreateFrame("Frame")
f:RegisterEvent("CHAT_MSG_SAY")
f:SetScript("OnEvent", OnEvent)--我见过很多只做f=CreateFrame(.)的加载项,所以它们不会一直相互冲突吗?
只要他们把它变成本地的,他们就不会冲突。如果每个人都建立了一个全局f框架,那么它就会发生冲突,是的。
发布于 2022-06-10 01:09:29
我对魔兽世界一无所知,但是我对Lua非常熟悉,我觉得我可以回答这个问题。如果默认情况下框架被放置在全局环境中,那么您发布的代码示例:
f = CreateFrame(...)不会产生这样的“冲突”本身--该框架可以简单地分配给f两次,或者一次分配给f,一次分配给传递给CreateFrame的任何名称。
这在Lua本身中不会造成任何问题,因为变量赋值是动态的,因此您可以使用这些值做任何您想做的事情。覆盖已经设置的变量不是问题,旧值将被释放并自动回收垃圾,或者如果旧值和新值是相同的引用,什么都不会发生。
如果您曾经看到返回值被分配给局部变量,例如函数内部的local f = CreateFrame(...),那么程序员使用局部变量而不是全局名称可能只是风格问题。
如果我正确地假定该函数设置了一个全局变量,但也返回了该值,那么它可能像您所观察到的那样是多余的,但是它是无关紧要的,也就是说它不会造成任何问题。
https://stackoverflow.com/questions/72567966
复制相似问题