Bob*_*non 2 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
Run Code Online (Sandbox Code Playgroud)
问题:
local retOK, ret1 = pcall(myTest,"string value");
Run Code Online (Sandbox Code Playgroud)
当我尝试样本时,我得到一个错误"尝试在本地'arg1'上执行连接(一个零值)".如果我将代码更改为:
local retOK, ret1 = pcall(myTest,"string value", "bob");
Run Code Online (Sandbox Code Playgroud)
然后我得到"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
Run Code Online (Sandbox Code Playgroud)
结果:尝试连接本地'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
Run Code Online (Sandbox Code Playgroud)
结果:字符串值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
Run Code Online (Sandbox Code Playgroud)
以下内容之间有什么区别:("."vs":")
Lua文档:
http://www.lua.org/pil/16.html
这种自我参数的使用是任何面向对象语言的中心点.大多数OO语言都有这种机制部分地隐藏在程序员之外,因此她不必声明这个参数(尽管她仍然可以使用单词self或this在方法中).Lua也可以使用冒号运算符隐藏此参数.我们可以将之前的方法定义重写为
function Account:withdraw (v)
self.balance = self.balance - v
end
Run Code Online (Sandbox Code Playgroud)
并且方法调用为
a:withdraw(100.00)
Run Code Online (Sandbox Code Playgroud)
冒号的作用是在方法定义中添加额外的隐藏参数,并在方法调用中添加额外的参数.冒号只是一个句法设施,虽然方便; 这里没有什么新东西.我们可以使用点语法定义函数并使用冒号语法调用它,反之亦然,只要我们正确处理额外参数:
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)
Run Code Online (Sandbox Code Playgroud)
可能的结论:
考虑到这一点,我假设在使用"pcall"调用":"函数时,必须提供"self"参数.