我在Lua制作了一个包含大量复选框的程序。每个复选框按照它们出现的顺序从1到100进行ID。选中复选框后,表会保存复选框ID并对其进行排序,取消选中该表时,会搜索该表以查找该复选框ID,然后在找到该表时将其删除,然后再次对表进行排序。
但是,我遇到第一个不删除自身值的问题。如果我检查一个早期的ID值然后取消选中它,它将被删除,但如果我尝试首先取消选中它,则不会被删除。
以下是代码:
switchCounter = 0
switchID = {}
--if checkbox-is-checked then
switchID[switchCounter] = checkbox.id
switchCounter = switchCounter + 1
table.sort(switchID)
--elseif checkbox-is-unchecked then
for p = 0, #switchID do
if switchID[p] == checkbox.id then
table.remove(switchID, p)
end
end
switchCounter = #switchID+1
table.sort(switchID)
在此之后(尚未)更改或触摸表格。只要它不是我想要移除的第一个值,它就会完美地工作,没有任何反应。
此代码使用Corona SDK,如果这与回答相关。
答案 0 :(得分:4)
通过将表索引设置为0,你会让Lua感到困惑。在Lua中,表是1索引的,与大多数编程语言习惯的不同。不幸的是,即使您使用了错误的索引范围,此代码的实际上仍可正常运行。但是,当您在第一个元素上调用table.remove
时,由于您的第一个元素的索引为0,因此您最终会调用table.remove(switchID, 0)
,此时Lua会查看你抬起眉毛,继续做......绝对没有。 0不是Lua的有效表索引,因此它不会删除您的第一个元素。
将您的指数更改为从1开始,一切都应该很好:
switchCounter = 1
switchID = {}
--if checkbox-is-checked then
switchID[switchCounter] = checkbox.id
switchCounter = switchCounter + 1
table.sort(switchID)
--elseif checkbox-is-unchecked then
for p = 1, #switchID do
if switchID[p] == checkbox.id then
table.remove(switchID, p)
end
end
switchCounter = #switchID+1
table.sort(switchID)
编辑:请参阅下面的优秀评论,以获取有关Lua在索引编制方面立场的更多信息。