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
相关:在“魔兽世界”中有很好的实时代码编辑器。我曾经使用LuaSlinger,但结果发现它不再开发,开发人员推荐使用[Hack](http://www.wowinterface.com/downloads/info11101-1.0.4.html) 。
然而,你可能在这里遇到的是冒号方法调用语法只是语法糖,同样适用于方法定义,如果我没记错的话。基本上,如果你做 foo:bar(“ quux!“)
,其中foo是一个对象,你实际上只是在做 foo.bar(foo,“ quux!“)
。
希望这能有所帮助!
Lua文档:
http://www.lua.org/pil/16.html
这个self参数的使用是任何面向对象语言的一个核心点。大多数面向对象语言部分隐藏了程序员的这种机制,以便她不必声明此参数(虽然她仍然可以在方法中使用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”参数。
- 如何在roblox studio中1:1导入真实世界的地形?
- 求解,lua_resume的第二次调用继续执行协程问题。
- 【上海普陀区】内向猫网络招募【Skynet游戏框架Lua后端程序员】
- SF爱好求教:如何用lua实现游戏内调用数据库函数实现账号密码注册?
- Lua实现网站后台开发
- LUA错误显式返回,社区常见的规约是怎么样的
- lua5.3下载库失败
- 请问如何实现文本框内容和某个网页搜索框内容连接,并把网页输出来的结果反馈到另外一个文本框上
- lua lanes多线程使用
- 一个kv数据库
- openresty 有没有比较轻量的 docker 镜像
- 想问一下,有大佬用过luacurl吗
- 在Lua执行过程中使用Load函数出现问题
- 为什么 neovim 里没有显示一些特殊字符?
- Lua比较两个表的值(不考虑键的顺序)
- 有个lua简单的项目,外包,有意者加微信 liuheng600456详谈,最好在成都
- 如何在 Visual Studio 2022 中运行 Lua 代码?
- addEventListener 返回 nil Lua
- Lua中获取用户配置主目录的跨平台方法
- 如何编写 Lua 模式将字符串(嵌套数组)转换为真正的数组?
好的,我认为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文件进行了一些更改,并键入:
尝试新的更改并将结果输出到我的屏幕。我没有太多的建议,因为我没有使用过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文件夹并禁用其他插件来测试这个函数。如果有区别,那么你可以一个一个地启用它们,直到找到问题所在。