尝试调用 global 'this' (零值)
Attempt to call global 'this' (a nil value)
我看到有人问过类似的问题,但我对 lua 编码不是很熟悉。
我正在尝试将旧的魔兽世界香草插件修复到经典客户端中的 运行。
代码如下:
function FHH_OnLoad()
this:RegisterEvent("PLAYER_ENTERING_WORLD");
this:RegisterEvent("UPDATE_MOUSEOVER_UNIT");
-- Register Slash Commands
SLASH_FHH1 = "/huntershelper";
SLASH_FHH2 = "/hh";
SlashCmdList["FHH"] = function(msg)
FHH_ChatCommandHandler(msg);
end
local version = GetAddOnMetadata("GFW_HuntersHelper", "Version");
GFWUtils.Print("Fizzwidget Hunter's Helper "..version.." initialized!");
end
并抛出以下错误;
Message: Interface\AddOns\GFW_HuntersHelper\HuntersHelper.lua:27: attempt to index global 'this' (a nil value)
Time: Tue Jun 30 09:25:14 2020
Count: 1
Stack: Interface\AddOns\GFW_HuntersHelper\HuntersHelper.lua:27: attempt to index global 'this' (a nil value)
Interface\AddOns\GFW_HuntersHelper\HuntersHelper.lua:27: in function `FHH_OnLoad'
[string "*:OnLoad"]:1: in function <[string "*:OnLoad"]:1>
Locals: (*temporary) = nil
(*temporary) = nil
(*temporary) = nil
(*temporary) = nil
(*temporary) = nil
(*temporary) = "attempt to index global 'this' (a nil value)"
我尝试过使用“this”语句,但我不确定该怎么做,我想看看这里的聪明人是否知道发生了什么事
如果有问题的插件很旧,那么在过去的某个时候(2010 年?)插件 API 已从全局变量移至局部变量。
框架在 XML 个文件中定义,就像您在评论中发布的那样:
<Frame name="HuntersHelperFrame">
<Scripts>
<OnLoad>FHH_OnLoad();</OnLoad>
<OnEvent>
FHH_OnEvent(event, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9);
</OnEvent>
</Scripts>
</Frame>
<Scripts>
中的元素实际上被称为函数,其内容为函数体。它们使用 一些 参数调用。您可以使用 World of Warcraft API 作为参考找出 what 参数。这不是官方的,但它是最接近参考手册的东西。
目前,您对 Widget handlers 感兴趣。
那么,您首先应该采取的步骤是:
- 更改 XML:
<Frame name="HuntersHelperFrame">
<Scripts>
<OnLoad>FHH_OnLoad(self)</OnLoad>
<OnEvent>
FHH_OnEvent(self, event, ...)
</OnEvent>
</Scripts>
</Frame>
- 更改 lua 以反映:
function FHH_OnLoad(self)
self:RegisterEvent("PLAYER_ENTERING_WORLD")
-- and so on, change all occurrences of `this` to `self`
-- or simply name the first argument `this` instead of `self`:
-- function FHH_OnLoad(this)
end
-- Change all of the functions:
function FHH_OnEvent(self, event, ...)
-- function body
end
根据插件的大小,它可能会变成一大堆工作。可悲的是,这还没有结束。小心脚本可能直接依赖全局变量的存在并做一些技巧。
我想你可以尝试使用 local this = self
和类似的技巧来解决它,但这可能并不适用于所有情况,并且由于框架如何解析 [=46] 可能会导致一些问题=].
最后一个音符; API 这些年来发生了很大变化,您很可能 运行 会遇到更多问题。祝你好运!
我看到有人问过类似的问题,但我对 lua 编码不是很熟悉。 我正在尝试将旧的魔兽世界香草插件修复到经典客户端中的 运行。
代码如下:
function FHH_OnLoad()
this:RegisterEvent("PLAYER_ENTERING_WORLD");
this:RegisterEvent("UPDATE_MOUSEOVER_UNIT");
-- Register Slash Commands
SLASH_FHH1 = "/huntershelper";
SLASH_FHH2 = "/hh";
SlashCmdList["FHH"] = function(msg)
FHH_ChatCommandHandler(msg);
end
local version = GetAddOnMetadata("GFW_HuntersHelper", "Version");
GFWUtils.Print("Fizzwidget Hunter's Helper "..version.." initialized!");
end
并抛出以下错误;
Message: Interface\AddOns\GFW_HuntersHelper\HuntersHelper.lua:27: attempt to index global 'this' (a nil value)
Time: Tue Jun 30 09:25:14 2020
Count: 1
Stack: Interface\AddOns\GFW_HuntersHelper\HuntersHelper.lua:27: attempt to index global 'this' (a nil value)
Interface\AddOns\GFW_HuntersHelper\HuntersHelper.lua:27: in function `FHH_OnLoad'
[string "*:OnLoad"]:1: in function <[string "*:OnLoad"]:1>
Locals: (*temporary) = nil
(*temporary) = nil
(*temporary) = nil
(*temporary) = nil
(*temporary) = nil
(*temporary) = "attempt to index global 'this' (a nil value)"
我尝试过使用“this”语句,但我不确定该怎么做,我想看看这里的聪明人是否知道发生了什么事
如果有问题的插件很旧,那么在过去的某个时候(2010 年?)插件 API 已从全局变量移至局部变量。
框架在 XML 个文件中定义,就像您在评论中发布的那样:
<Frame name="HuntersHelperFrame">
<Scripts>
<OnLoad>FHH_OnLoad();</OnLoad>
<OnEvent>
FHH_OnEvent(event, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9);
</OnEvent>
</Scripts>
</Frame>
<Scripts>
中的元素实际上被称为函数,其内容为函数体。它们使用 一些 参数调用。您可以使用 World of Warcraft API 作为参考找出 what 参数。这不是官方的,但它是最接近参考手册的东西。
目前,您对 Widget handlers 感兴趣。
那么,您首先应该采取的步骤是:
- 更改 XML:
<Frame name="HuntersHelperFrame"> <Scripts> <OnLoad>FHH_OnLoad(self)</OnLoad> <OnEvent> FHH_OnEvent(self, event, ...) </OnEvent> </Scripts> </Frame>
- 更改 lua 以反映:
function FHH_OnLoad(self) self:RegisterEvent("PLAYER_ENTERING_WORLD") -- and so on, change all occurrences of `this` to `self` -- or simply name the first argument `this` instead of `self`: -- function FHH_OnLoad(this) end -- Change all of the functions: function FHH_OnEvent(self, event, ...) -- function body end
根据插件的大小,它可能会变成一大堆工作。可悲的是,这还没有结束。小心脚本可能直接依赖全局变量的存在并做一些技巧。
我想你可以尝试使用 local this = self
和类似的技巧来解决它,但这可能并不适用于所有情况,并且由于框架如何解析 [=46] 可能会导致一些问题=].
最后一个音符; API 这些年来发生了很大变化,您很可能 运行 会遇到更多问题。祝你好运!