Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/lua/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Lua 尝试调用全局';这';(零值)_Lua_Add On_World Of Warcraft - Fatal编程技术网

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

我可以看到有人问过类似的问题,但是我对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)"
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);
中的元素实际上被称为函数,其内容作为函数体。用一些参数调用它们。您可以找出哪些参数用作引用。这不是官方的,但它是最接近参考手册的

就目前而言,您感兴趣的是

现在,您应该采取的第一步是:

  • 更改XML:
    
    FHH_空载(自)
    FHH_事件(自身、事件等)
    
  • 更改lua以反映:
    功能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);
    非常感谢。有了你的提示,我可以让插件工作了。非常感谢!没有更多的错误,现在我需要弄清楚为什么不能将技能打印到工具提示中:)