Lua 什么';是PCALL还是Wowwiki错了?
这是一个魔兽世界的lua脚本问题。这里并没有很多人被问到这些问题,但我不知道该去哪里,Stackoverflow是程序员寻找答案的绿洲 问题: Wowwiki声明第二、第三、第四个参数是调用函数的第一、第二、第三个参数。我觉得这不是真的。我发现第三、第四、第五个参数最终是第一、第二、第三个参数 链接: 功能:Lua 什么';是PCALL还是Wowwiki错了?,lua,world-of-warcraft,Lua,World Of Warcraft,这是一个魔兽世界的lua脚本问题。这里并没有很多人被问到这些问题,但我不知道该去哪里,Stackoverflow是程序员寻找答案的绿洲 问题: Wowwiki声明第二、第三、第四个参数是调用函数的第一、第二、第三个参数。我觉得这不是真的。我发现第三、第四、第五个参数最终是第一、第二、第三个参数 链接: 功能: function myTest(arg1) return arg1 .. 10; end 问题: local retOK, ret1 = pcall(myTest,"strin
function myTest(arg1)
return arg1 .. 10;
end
问题:
local retOK, ret1 = pcall(myTest,"string value");
当我尝试该示例时,我得到一个错误“尝试对本地“arg1”(一个nil值)执行连接”。如果我将代码更改为:
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”(一个nil值)
结果:字符串值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
下面的代码可以工作,但为什么
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)
- 函数BobsToolbox:Test1(arg1)
- 好吧,我不认为沃维基错了。以下是我正在使用的代码:
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文件中,并确保在选择我的角色并登录之前在addons窗口中启用了mod。我对源lua文件做了一些更改,并键入:
/控制台重新加载
尝试新的更改并将结果输出到我的屏幕。我没有太多的建议给你,因为我没有做太多的工作与魔兽世界插件。你有没有在一个空白的插件中尝试过这段代码,以确保没有其他干扰?你真的在游戏中试过这个代码吗?如果你能提供更多的信息或想让我尝试其他任何东西,让我知道
更新:决定尝试更多测试。以下是测试(具有相同的功能):
结果是:
10
attempt to concatenate local 'arg1' (a nil value)
有趣的是,当arg1为nil时,我看到的错误与您看到的错误略有不同。我很想知道您是如何测试代码的。或者你没有把错误一字不差地抄下来?我想你也可以尝试清除你的WTF文件夹,禁用你的其他插件来测试这个功能。如果有区别,那么你可以一次启用一个,直到你发现问题。相关:魔兽世界有很好的实时代码编辑器。我曾经使用过LuaSlinger,但后来发现它不再被开发,而是由开发人员推荐 然而,您可能在这里遇到的是冒号方法调用语法只是语法糖,方法定义IIRC也是如此。基本上,如果您使用
foo:bar(“qux!”)
,其中foo是一个对象,那么实际上您只是在使用foo.bar(foo,“qux!”)
希望有帮助 Lua文档: 自参数的使用是任何面向对象语言的中心点。大多数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)
可能的结论:
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
考虑到这一点,我假设在使用“pcall”调用“:”函数时,必须提供“self”参数。很抱歉,我遗漏了所需的信息。当时我认为这并不重要。如果可以的话,我想看看你是否同意我的观点。很抱歉,我想我遗漏了需要的信息。当时我认为这并不重要。如果可以,我想看看你是否同意我的输入。是的,看起来你已经找到答案了!创建函数BobsToolbox:Test1(arg1)时,使用pcall的函数名后的第一个参数应该是要操作的对象。之后的参数就是您实际想要使用的参数。