这是一个魔兽世界(魔兽世界)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“:”)
答案 0 :(得分:6)
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”参数。
答案 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文件夹并禁用你的其他插件来测试这个功能。如果它有所不同,那么你可以一次启用它们,直到找到问题为止。