Lua 尝试调用全局';这';(零值)
我可以看到有人问过类似的问题,但是我对lua编码不是很熟悉。 我正在尝试修复一个旧的魔兽世界香草插件,在经典客户端中运行 代码如下:Lua 尝试调用全局';这';(零值),lua,add-on,world-of-warcraft,Lua,Add On,World Of Warcraft,我可以看到有人问过类似的问题,但是我对lua编码不是很熟悉。 我正在尝试修复一个旧的魔兽世界香草插件,在经典客户端中运行 代码如下: function FHH_OnLoad() this:RegisterEvent("PLAYER_ENTERING_WORLD"); this:RegisterEvent("UPDATE_MOUSEOVER_UNIT"); -- Register Slash Commands SL
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)"
Message:Interface\AddOns\GFW\u hunterselper\hunterselper.lua:27:尝试索引全局“this”(一个nil值)
时间:周二6月30日09:25:14 2020
计数:1
Stack:Interface\AddOns\GFW\u HuntersHelper\HuntersHelper.lua:27:尝试索引全局“this”(一个nil值)
接口\AddOns\GFW\u hunterselper\hunterselper.lua:27:在函数'FHH\u OnLoad'中
[字符串“*:OnLoad”]:1:在函数中
当地人:(*临时)=无
(*临时)=零
(*临时)=零
(*临时)=零
(*临时)=零
(*临时)=“尝试索引全局“this”(一个零值)”
我试过玩弄“this”语句,但我真的不知道该怎么办,我想看看在座的聪明人中是否有人知道发生了什么事如果所讨论的加载项很旧,那么在过去的某个时候(2010?),加载项API已经从全局变量转移到局部变量 框架是在XML文件中定义的,就像您在评论中发布的框架一样:
FHH_OnLoad();
FHH_事件(事件arg1、arg2、arg3、arg4、arg5、arg6、arg7、arg8、arg9);
中的元素实际上被称为函数,其内容作为函数体。用一些参数调用它们。您可以找出哪些参数用作引用。这不是官方的,但它是最接近参考手册的
就目前而言,您感兴趣的是
现在,您应该采取的第一步是:
FHH_空载(自)
FHH_事件(自身、事件等)
功能FHH\U加载(自)
self:RegisterEvent(“玩家进入世界”)
--依此类推,将所有出现的'this'更改为'self'`
--或者简单地将第一个参数命名为“this”,而不是“self”:
--函数FHH_OnLoad(此)
结束
--更改所有功能:
功能FHH_OneEvent(自身、事件等)
--功能体
结束
localthis=self
之类的技巧来解决这个问题,但这可能并不适用于所有情况,并且可能会由于框架如何解析XML而导致一些问题
最后一项说明;这些年来,API发生了很大的变化,您很可能会遇到更多的问题。祝你好运 像魔兽世界附加框架这样的“框架”经常给语言带来新的味道,所以我的评论在你的情况下可能是错误的。Lua中对当前对象的引用称为
self
。当您使用:
而不是
调用函数时,您调用此函数的对象将作为第一个参数隐式传递。如果将函数定义为something:yourfunction()
而不是something.yourfunction()
则第一个参数隐式命名为self
。函数定义function something:yourfunction()[…]end
等于function something.yourfunction(self)[…]end
脚本中的第27行是什么?第27行是onload;此:注册事件(“玩家进入世界”);我猜下一行也是一样的,因为这是一个相同的函数,它实际上取决于发生了什么,以及原始开发人员采取了什么方法。在过去的某个时刻,Blizz从各种全局变量转移到了局部变量。检查FHH_OnLoad实际使用的位置(名称表明它位于XML中的某个位置)。
将一个参数self
传递给它的内容,然后可以传递给FHH_OnLoad
。没错,它位于XML文件中。我想我可能是吃得太饱了,我是一个爱好C#coder,我想我可以通过修复这个插件来寻找我的方法,但看起来它比我预期的要复杂@绿色尽管你是对的,FHH_OnLoad在xml中,没有参数;FHH_OnLoad();FHH_事件(事件arg1、arg2、arg3、arg4、arg5、arg6、arg7、arg8、arg9);
非常感谢。有了你的提示,我可以让插件工作了。非常感谢!没有更多的错误,现在我需要弄清楚为什么不能将技能打印到工具提示中:)