什么是PCALL或Wowwiki错了?

时间:2009-04-09 02:50:01

标签: lua world-of-warcraft

这是一个魔兽世界(魔兽世界)lua脚本问题。这里没有多少人被问到,但我无处可转,Stackoverflow是程序员的绿洲,可以找到答案。

问题:

Wowwiki说第2,第3,第4个参数是你的调用函数第1,第2,第3个参数。我不认为这是真的。我发现第3,第4,第5个参数最终成为第1,第2,第3个参数。

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

功能:

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

问题:

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

当我尝试样本时,我得到一个错误“尝试在本地'arg1'上执行连接(一个零值)”。如果我将代码更改为:

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'(零值)

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)
  • function BobsToolbox:Test1(arg1)

3 个答案:

答案 0 :(得分:6)

Lua文档:

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

自我参数的使用是任何面向对象语言的中心点。大多数OO语言都有部分隐藏程序员的机制,因此她不必声明此参数(尽管她仍然可以在方法中使用单词selfthis)。 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”参数。

答案 1 :(得分:2)

相关:WoW有很好的实时代码编辑器。我曾经使用过LuaSlinger,但事实证明它已经不再开发了,开发人员推荐使用Hack

但是,您可能在这里遇到的是冒号方法调用语法只是语法糖,同样适用于方法定义IIRC。基本上,如果你做foo:bar("quux!"),其中foo是一个对象,你实际上只是做foo.bar(foo, "quux!")

希望有所帮助!

答案 2 :(得分:1)

嗯,我不认为WoWWiki是错的。这是我正在使用的代码:

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文件中,并确保在选择我的角色并登录之前在插件窗口中启用了mod。我对源lua文件进行了一些更改并输入:

  

/ console reloadui

尝试新的更改并将结果输出到我的屏幕。我没有太多的建议可以提供给你,因为我没有做过很多关于魔兽插件的工作。您是否在空白插件中尝试使用此代码以确保没有其他任何干扰?你真的尝试过游戏中的代码吗?如果您可以提供更多信息或希望我尝试其他任何信息,请告诉我们!

更新:决定再尝试一些测试。以下是测试(功能相同):

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为nil时我看到的错误与您看到的错误略有不同。我有兴趣了解您如何测试代码。或许你没有逐字复制错误?我想你也可以尝试清除你的WTF文件夹并禁用你的其他插件来测试这个功能。如果它有所不同,那么你可以一次启用它们,直到找到问题为止。