【问题标题】:Removing First Value in Checkbox Table删除复选框表中的第一个值
【发布时间】:2017-10-08 15:21:02
【问题描述】:

我正在用 Lua 制作一个包含大量复选框的程序。每个复选框按照它们出现的顺序从 1 到 100 进行标识。选中复选框时,表格会保存复选框 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。

【问题讨论】:

    标签: checkbox lua coronasdk lua-table


    【解决方案1】:

    你把表索引从 0 开始弄糊涂了 Lua。在 Lua 中,表是 1 索引的,这与你在大多数编程语言中习惯的不同。不幸的是,即使您使用了错误的索引范围,大部分此代码实际上仍然有效。然而,当你在 first 元素上调用 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 对索引的立场。

    【讨论】:

    • 谢谢!疯狂的是,我一直在使用 Lua,我从来不知道表索引从 1 开始,但从来没有遇到过这样的问题。欣赏!
    • 嘿,我使用 Lua 已经有一段时间了,当我打开解释器并开始玩表格来弄清楚这里出了什么问题时,我完全感到困惑......我不知道使用 0 索引仍然可以工作,即使它不应该这样做! ._.我们俩的学习经验!
    • (1/2) Lua 表不关心你使用什么键。如果将表用作数组,则可以从 0,1,23,-42,... 开始,以 1,-0.25,5,... 为步长,可以使用 "a","b",..."aa" “ab”,……或任何你喜欢的——没关系。桌子和 Lua 都不在乎。 (所以它不应该工作!)但是标准的table库(和#ipairs)是完全不同的野兽:它们是非常自以为是。对于他们来说,表/数组/“序列”必须从 1 开始,递增 1,并且在被视为数组的内容中不能有任何间隙 (nils)。这就是为什么事情会起作用……直到您使用这些功能。
    • (2/2) 你可以编写自己的数组库 / 替换 ipairs / ...或两次有意义的地方。 一般 但是,这没有任何意义,因为其他所有内容(string 库、debug 库……)也是基于 1 的。 [“Lua 无关紧要”位不是 100% 正确的——基于 1 的数组有一个小的优化,因此它需要更少的内存/时间。但这只是“如果您遵守则更快”,而不是“如果您偏离则完全破损”,如果您不需要它可以忽略/在其他地方保存更多。]
    猜你喜欢
    • 1970-01-01
    • 2018-01-23
    • 1970-01-01
    • 1970-01-01
    • 2014-07-11
    • 1970-01-01
    • 2018-06-20
    • 2016-07-12
    • 2018-09-27
    相关资源
    最近更新 更多