代码之家  ›  专栏  ›  技术社区  ›  Bobby Cannon

pcall怎么了?还是wowiki错了?

  •  2
  • Bobby Cannon  · 技术社区  · 15 年前

    这是一个魔兽世界的Lua脚本问题。这里没有很多人被问到,但是我没有方向,StackOverflow是程序员解答问题的绿洲。

    问题:

    Wowwiki声明第2、3、4个参数是您的调用函数第1、2、3个参数。我不认为这是真的。我发现第三、第四、第五个论点最终是第一、第二、第三个论点。

    链接: http://www.wowwiki.com/API_pcall

    功能:

    function myTest(arg1) 
      return arg1 .. 10; 
    end 
    

    问题:

    local retOK, ret1 = pcall(myTest,"string value"); 
    

    当我尝试样本时,我得到一个错误“尝试对本地的arg1(nil值)执行concatenate”。如果我将代码更改为:

    local retOK, ret1 = pcall(myTest,"string value", "bob"); 
    

    然后我得到“bob10”的输出。第二个论点在哪里,它是为了什么?

    更多测试:

    function BobsToolbox:RunTest() 
      local test1, value1 = pcall(BobsToolbox.Test1, "string value"); 
      SharpDeck:Print("Test1: " .. tostring(test1) .. " Value: " .. tostring(value1)); 
    end 
    
    function BobsToolbox:Test1(arg1) 
      return arg1 .. "10"; 
    end 
    

    结果:尝试连接本地“arg1”(nil值)

    function BobsToolbox:RunTest() 
      local test1, value1 = pcall(Test1, "string value"); 
      SharpDeck:Print("Test1: " .. tostring(test1) .. " Value: " .. tostring(value1)); 
    end 
    
    function Test1(arg1) 
      return arg1 .. "10"; 
    end 
    

    结果:字符串值10

    我对Lua不熟悉,我不明白为什么这些不同。

    新问题:

    以下代码有效,但为什么?

    function BobsToolbox:RunTest()
      local test1, value1 = pcall(BobsToolbox.Test1, "string value");
      SharpDeck:Print("Test1: " .. tostring(test1) .. " Value: " .. tostring(value1));
    end
    
    function BobsToolbox.Test1(arg1)
      return arg1 .. "10";
    end
    

    下面的区别是什么:(“.”vs“:”)

    • 函数bobstoolbox.test1(arg1)
    • 函数bobstoolbox:test1(arg1)
    3 回复  |  直到 15 年前
        1
  •  6
  •   No Name    8 年前

    Lua文件:

    http://www.lua.org/pil/16.html

    在任何面向对象的语言中,使用自参数都是一个中心点。大多数OO语言都有一部分对程序员隐藏的机制,这样她就不必声明这个参数(尽管她仍然可以使用这个词 self this 在方法中)。Lua还可以使用冒号操作符隐藏这个参数。我们可以将前面的方法定义重写为

    function Account:withdraw (v) 
        self.balance = self.balance - v 
    end 
    

    方法调用为

    a:withdraw(100.00) 
    

    冒号的作用是在方法定义中添加一个额外的隐藏参数,并在方法调用中添加一个额外的参数。冒号只是一种语法工具,尽管它很方便;这里没有什么新的东西。我们可以用点语法定义一个函数,并用冒号语法调用它,反之亦然,只要我们正确处理额外的参数:

    Account = { balance=0,
        withdraw = function (self, v) 
            self.balance = self.balance - v 
        end 
    } 
    
    function Account:deposit (v) 
        self.balance = self.balance + v 
    end 
    
    Account.deposit(Account, 200.00) 
    Account:withdraw(100.00) 
    

    可能的结论:

    考虑到这一点,我假设在使用“pcall”调用“:”函数时,必须提供“self”参数。

        2
  •  2
  •   AKX Bryan Oakley    15 年前

    相关:哇有很好的实时代码编辑器。我以前用的是Luasinger,但后来发现它不再被开发了,开发人员建议 Hack 相反。

    然而,您可能会遇到的是冒号方法调用语法只是语法糖,方法定义也是如此,IIRC。基本上,如果你这样做的话 foo:bar("quux!") 当foo是一个物体时,你实际上只是在做 foo.bar(foo, "quux!") .

    希望有帮助!

        3
  •  1
  •   Venesectrix    15 年前

    嗯,我不认为沃维基错了。下面是我使用的代码:

    function myTest(arg1) return arg1 .. 10; end 
    
    local retOK, ret1 = pcall(myTest,"string value"); 
    DEFAULT_CHAT_FRAME:AddMessage(ret1);
    
    local retOK, ret1 = pcall(myTest,"string value", "bob"); 
    DEFAULT_CHAT_FRAME:AddMessage(ret1);
    

    以下是我在常规聊天框中得到的输出:

    string value10
    string value10
    

    您如何尝试您的示例代码?我只是将我的代码粘贴到一个现有的mod lua文件中,并确保在选择我的角色并登录之前在addons窗口中启用mod。我对源lua文件做了一些更改,然后键入:

    /控制台重新加载

    尝试新的更改并将结果输出到我的屏幕。我没有太多的建议给你,因为我没有做太多的工作与哇插件。您是否在空白加载项中尝试过此代码以确保没有其他干扰?你真的在游戏中试过密码吗?如果你能提供更多的信息或者想让我尝试其他任何东西,请告诉我!

    更新 :决定再做几次测试。以下是测试(功能相同):

    local retOK, ret1 = pcall(myTest,""); 
    DEFAULT_CHAT_FRAME:AddMessage(ret1);
    
    local retOK, ret1 = pcall(myTest, nil, "bob"); 
    DEFAULT_CHAT_FRAME:AddMessage(ret1);
    

    结果是:

    10
    attempt to concatenate local 'arg1' (a nil value)
    

    有趣的是,arg1为零时我看到的错误与您看到的错误略有不同。我想知道你是如何测试你的代码的。或者你没有逐字地把错误记录下来?我想你也可以尝试清除你的wtf文件夹,禁用你的其他插件来测试这个功能。如果这有区别,那么您可以一次启用一个,直到找到问题为止。

    推荐文章
    cFx  ·  WoW添加到REST API
    9 年前