我一直在为游戏的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]
?不必担心表和东西的创建,因为需要时已经在发生表,否则它也会给出错误信息。
答案 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