Как вызвать анонимную функцию из фрейма в аддоне WoW?

Я использую генератор кода, который генерирует множество анонимных функций. Я думал попробовать вызвать его из фрейма, но, похоже, это не сработало; Я получил:

Date: 2020-09-18 18:42:27
ID: 1
Error occured in: Global
Count: 1
Message: [string "HelloWorldFrame:OnLoad"] line 1:
   attempt to call global 'HelloWorld' (a nil value)
Debug:
   [C]: HelloWorld()
   [string "*:OnLoad"]:1:
      [string "*:OnLoad"]:1

Если я изменю следующее:

local HelloWorld = function()
  print("Hello, World!");
end

to:

function HelloWorld() 
  print("Hello, World!"); 
end

это сработает.

Вот мой XML:

<Ui xmlns="http://www.blizzard.com/wow/ui/" 
                   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
                   xsi:schemaLocation="http://www.blizzard.com/wow/ui/ 
                   ..\..\FrameXML\UI.xsd">
  <Frame name="HelloWorldFrame">
   <Scripts>
    <OnLoad>
     HelloWorld();
    </OnLoad>
   </Scripts>
  </Frame>
</Ui>

Это возможно?


person bbarker    schedule 18.09.2020    source источник


Ответы (1)


Короткий ответ: вам нужно использовать глобальные переменные, если вы используете XML. Что-то вроде этого

Луа

MyUniqueAddon = {}

function MyUniqueAddon:HelloWorld()
    print("Hello, World!"); 
end

XML

<Frame name="HelloWorldFrame">
    <Scripts>
        <OnLoad>
            MyUniqueAddon:HelloWorld();
        </OnLoad>
    </Scripts>
</Frame>

Вы также можете просто делать все на Lua

local function OnEvent(self, event)
    print("Hello, World!"); 
end

local f = CreateFrame("Frame")
f:RegisterEvent("PLAYER_ENTERING_WORLD")
f:SetScript("OnEvent", OnEvent)

Или в этом случае вообще не используйте рамку, если вы просто хотите напечатать что-то в качестве упражнения.

print("Hello, World!"); 
person Ketho    schedule 19.09.2020
comment
Хорошо, спасибо также за указание на вариант all-Lua. Для моего варианта использования это определенно предпочтительнее. - person bbarker; 19.09.2020