Lua 什么';是PCALL还是Wowwiki错了?

Lua 什么';是PCALL还是Wowwiki错了?,lua,world-of-warcraft,Lua,World Of Warcraft,这是一个魔兽世界的lua脚本问题。这里并没有很多人被问到这些问题,但我不知道该去哪里,Stackoverflow是程序员寻找答案的绿洲 问题: Wowwiki声明第二、第三、第四个参数是调用函数的第一、第二、第三个参数。我觉得这不是真的。我发现第三、第四、第五个参数最终是第一、第二、第三个参数 链接: 功能: function myTest(arg1) return arg1 .. 10; end 问题: local retOK, ret1 = pcall(myTest,"strin

这是一个魔兽世界的lua脚本问题。这里并没有很多人被问到这些问题,但我不知道该去哪里,Stackoverflow是程序员寻找答案的绿洲

问题:

Wowwiki声明第二、第三、第四个参数是调用函数的第一、第二、第三个参数。我觉得这不是真的。我发现第三、第四、第五个参数最终是第一、第二、第三个参数

链接:

功能:

function myTest(arg1) 
  return arg1 .. 10; 
end 
问题:

local retOK, ret1 = pcall(myTest,"string value"); 
当我尝试该示例时,我得到一个错误“尝试对本地“arg1”(一个nil值)执行连接”。如果我将代码更改为:

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值)

结果:字符串值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 
下面的代码可以工作,但为什么

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)

    • 好吧,我不认为沃维基错了。以下是我正在使用的代码:

      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文件做了一些更改,并键入:

      /控制台重新加载

      尝试新的更改并将结果输出到我的屏幕。我没有太多的建议给你,因为我没有做太多的工作与魔兽世界插件。你有没有在一个空白的插件中尝试过这段代码,以确保没有其他干扰?你真的在游戏中试过这个代码吗?如果你能提供更多的信息或想让我尝试其他任何东西,让我知道

      更新:决定尝试更多测试。以下是测试(具有相同的功能):

      结果是:

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

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

      相关:魔兽世界有很好的实时代码编辑器。我曾经使用过LuaSlinger,但后来发现它不再被开发,而是由开发人员推荐

      然而,您可能在这里遇到的是冒号方法调用语法只是语法糖,方法定义IIRC也是如此。基本上,如果您使用
      foo:bar(“qux!”)
      ,其中foo是一个对象,那么实际上您只是在使用
      foo.bar(foo,“qux!”)


      希望有帮助

      Lua文档:

      自参数的使用是任何面向对象语言的中心点。大多数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) 
      
      可能的结论:

      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 
      

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

      很抱歉,我遗漏了所需的信息。当时我认为这并不重要。如果可以的话,我想看看你是否同意我的观点。很抱歉,我想我遗漏了需要的信息。当时我认为这并不重要。如果可以,我想看看你是否同意我的输入。是的,看起来你已经找到答案了!创建函数BobsToolbox:Test1(arg1)时,使用pcall的函数名后的第一个参数应该是要操作的对象。之后的参数就是您实际想要使用的参数。