在 for 循环期间密钥未存储在 lua 表中

Posted

技术标签:

【中文标题】在 for 循环期间密钥未存储在 lua 表中【英文标题】:Key not stored in lua table during for-loop 【发布时间】:2020-02-28 09:20:53 【问题描述】:

我很难理解 Lua 中的这种行为。如果我在本地控制台中执行:

tab=
tab[100] = "E"

表格如下所示:


  [100] = "E"

现在我用几个条件在 for 循环中填充我的表:

cell_types =     
cell = 1    
for y=1, 1000 do
    for x=1, 1000 do
      if some_condition then
        cell_types[cell] = "E"
      elseif some_condition then
        cell_types[cell] = "M"
      else
        cell_types[cell] = "C"
      end
    cell = cell+1
    end
  end

现在表格看起来像这样:

 "E", "E", "M", "E", "C", "C", "E", "E", "E", "E", "E", "E", "E", "E", "E", "E", "E", "E" 

如果我删除第一个表调用 (cell_types[cell] = "E"),那么我又有键/值对:


  [101] = "M",
  [102] = "M",
  [103] = "M",
  [104] = "M",
  [105] = "M",
  [106] = "M",
  [107] = "M"

什么可能导致这种行为?以及如何确保始终将键/值对存储在我的表中?

谢谢。

【问题讨论】:

【参考方案1】:

Lua 表始终是键值对的集合。

它只是在内部进行了优化,以将连续序列存储为数组,将不连续值存储为哈希映射。

通过删除一些赋值,例如cell_types[cell] = "E" 的情况,您在序列中引入了漏洞,因此它不再属于数组实现部分,并且必须作为带有pairs() 的哈希映射进行迭代。请注意,ipairs() 只会迭代表的数组部分,并且会停在某个未定义的点,在那里它会依次找到一个洞。

【讨论】:

以上是关于在 for 循环期间密钥未存储在 lua 表中的主要内容,如果未能解决你的问题,请参考以下文章

在 Azure 存储帐户表中存储 API 密钥/密码

哈希表调整大小:我们如何在不知道密钥的情况下做到这一点?

在 Maven 发布期间跳过 GPG 密钥

获取 HTML5 本地存储密钥

Github 操作在构建期间未识别秘密值

登录时未通过凭据提供程序加载 KSP(密钥存储提供程序)