PCALL是什么意思,还是Wowwiki给出的信息有误?

这是一个 WoW(魔兽世界)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");

当我尝试这个示例时,我会得到一个错误的信息“在local '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

结果:string value10

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

原文链接 https://stackoverflow.com/questions/732607

点赞
stackoverflow用户83307
stackoverflow用户83307

好的,我认为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

尝试新的更改并将结果输出到我的屏幕。我没有太多的建议,因为我没有使用过WoW插件。你是不是尝试在一个空的插件中运行这段代码以确保没有其他干扰?你实际上在游戏中尝试了这个代码吗?如果你能提供更多信息或让我尝试其他任何事情,请告诉我!

更新: 决定尝试更多测试。这些是测试(使用相同的函数):

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文件夹并禁用其他插件来测试这个函数。如果有区别,那么你可以一个一个地启用它们,直到找到问题所在。

2009-04-09 05:53:38
stackoverflow用户51685
stackoverflow用户51685

相关:在“魔兽世界”中有很好的实时代码编辑器。我曾经使用LuaSlinger,但结果发现它不再开发,开发人员推荐使用[Hack](http://www.wowinterface.com/downloads/info11101-1.0.4.html)

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

希望这能有所帮助!

2009-04-09 06:29:33
stackoverflow用户43976
stackoverflow用户43976

Lua文档:

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

这个self参数的使用是任何面向对象语言的一个核心点。大多数面向对象语言部分隐藏了程序员的这种机制,以便她不必声明此参数(虽然她仍然可以在方法中使用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”参数。

2009-04-09 14:06:50