当前位置:  开发笔记 > 编程语言 > 正文

什么是PCALL或Wowwiki错了?

如何解决《什么是PCALL或Wowwiki错了?》经验,为你挑选了1个好方法。

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

function BobsToolbox.Test1(arg1)

功能BobsToolbox:Test1(arg1)

Bobby Cannon.. 6

Lua文档:

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

这种自我参数的使用是任何面向对象语言的中心点.大多数OO语言都有这种机制部分地隐藏在程序员之外,因此她不必声明这个参数(尽管她仍然可以使用单词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"参数.



1> Bobby Cannon..:

Lua文档:

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

这种自我参数的使用是任何面向对象语言的中心点.大多数OO语言都有这种机制部分地隐藏在程序员之外,因此她不必声明这个参数(尽管她仍然可以使用单词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"参数.

推荐阅读
喜生-Da
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有