[lua]:值为1的键与常规键1的功能不同

时间:2018-06-24 08:28:04

标签: lua

我一直在为游戏的mod im编写代码,但是遇到一个问题,即输入键时表不返回值:

for k, v in pairs(self.math) do
    print(self.exce[1])
    print(self.exce[k])
    print(k)
    if self.exce[k] ~= nil then
        self.math[k] = nil
    end
end

这是脚本中断的特定部分。当我在游戏中运行这些命令时,它将返回:

[lua]: true
[lua]: nil
[lua]: 1

基本上是指1不等于1。 我用来存储数据的功能是

function filterExceptions.server_onException( self, id )
    if self.exce[id] == nil then
        self.exce[id] = true
        self.network:sendToClients( "client_onList", id )
    else
        self.exce[id] = true
        self.network:sendToClients( "client_offList", id )
    end
end

在此代码中,自我是由游戏制作的表格,您可以访问该表格并从中获取游戏数据或将其存储在其中,并且ID来自我为获取玩家ID而创建的函数。在这种情况下,此id为1(我多次打印了此代码)。我知道该代码的每个部分都可以正常工作,除了第一个块中的代码,尤其是它尝试执行self.exce[k]的部分。我已经做了很多尝试,就像遍历self.exce中的每个变量来查看它是否在其中然后进行处理,但是仍然无法正常工作。 lua确实认为k〜= 1非常令人讨厌,但我什至在有效的部分中使用了类似的代码。

那么这段代码有什么问题呢,因为它在self.exce[k]起作用的情况下却没有打印self.exce[1]?不必担心表和东西的创建,因为需要时已经在发生表,否则它也会给出错误信息。

2 个答案:

答案 0 :(得分:1)

将一些不同的注释和您的代码放在一起,看起来就像“成对”循环(或也许所有这些循环)的特定迭代中数组的索引值一样,但我将在一分钟)是一个字符串,而不是整数。

总结一下,如果您不想阅读全部内容,“成对的k,v对”循环将遍历整个数组,将k设置为值v的索引。看来您的“成对for”循环正在尝试遍历nil的值,其中k是字符串而不是整数。您可能还想在for循环中使用ipairs代替pairs

someArray[1]的值与someArray["1"]的值不同。 对于任何给定的数组,索引[1]与索引["1"]完全不同。 一个简单的解决方法是使用

ind = tonumber(k)
print(self.exce[ind])

这会将字符串k转换为数字类型。请注意,如果k是非数字字符串,则可能会引发错误。如果数组具有索引为非数字字符串的任何值,则可能会出现错误。另一个答案表明,将索引k转换为字符串而不是整数也可以,并且如果为索引使用非数字值,也不会引发错误。

我对为什么会发生这种情况的猜测是,您用来将数据存储到数组filterExceptions.server_onException( self, id )的函数正在传递字符串而不是整数,这将导致在“成对”循环的特定迭代中,将k值设置为字符串。

为了更好地理解这一点,下面是一些示例代码:

a = {true, false, false}
a[1] = true
a["1"] = true

print("Raw for in pairs loop")
for k, v in pairs (a) do
  print(type(k)..k)
end

print("For in pairs converting k to a number")
for k, v in pairs (a) do
  ind = tonumber(k)
  print(type(ind)..ind)
end

print("For in ipairs")
--which I'm not sure I completely understand but 
--it seems to skip over any iteration where k is not a number
for k, v in ipairs(a) do
  print(type(k)..k)
end

此代码产生以下输出:

Raw for in pairs loop   
number1 
number2 
number3 
string1 
For in pairs converting k to a number   
number1 
number2 
number3 
number1 
For in ipairs   
number1 
number2 
number3 

编辑:不确定self.math表中正在发生什么,因此我无法对此发表评论。

EDIT2:我也请您参考以下链接:lua: iterate through all pairs in table 如果您还没有的话,那么最重要的答案应该可以帮助您了解配对和配对的区别。您可能想要使用对来防止k的值v == nil被成对迭代。对将遍历每个键/值对,而对则遍历从1开始直到达到nil值的整数键。

EDIT3:对不起,这是一个很长的答案...我只是想做个透彻的了解。

答案 1 :(得分:0)

它似乎无法将id转换为字符串,对此,我还是很困惑,为什么相同的代码在另一个块而不是在另一个块上起作用。

function filterExceptions.server_onException( self, id )
local id2 = tostring(id)
if self.exce[id2] == nil then
    self.exce[id2] = true
    self.network:sendToClients( "client_onList", id )
else
    self.exce[id2] = true
    self.network:sendToClients( "client_offList", id )
end
end