loops - 在 for 循环期间密钥未存储在 lua 表中
问题描述
我正在努力理解 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"
}
什么可能导致这种行为?以及如何确保始终将键/值对存储在我的表中?
谢谢你。
解决方案
Lua 表始终是键值对的集合。
它只是在内部进行了优化,以将连续序列存储为数组,将不连续值存储为哈希图。
通过删除一些赋值,比如cell_types[cell] = "E"
case,你在序列中引入了漏洞,所以它不再属于数组实现部分,并且必须作为哈希映射迭代pairs()
。请注意,它ipairs()
只会迭代表的数组部分,并且会停在某个未定义的点,在那里它会依次找到一个洞。
推荐阅读
- excel - 是否有一个 Excel 函数(/方法)用于基于两列与 vlookup 属性进行近似匹配的文本?
- python - Python:匹配列表中的元素
- azure - 是否可以从 Azure 数据工厂中的表中更新行值?
- vb.net - Contains() 语句没有找到指示的字符串
- solr - 如何使配置更改在 Solr 7.3 中生效
- javascript - 为 Next.js 的服务器文件设置自定义目录
- java - 在 Spring Boot 中发送文件
- java - ExpectedConditions.refresh 和 ExpectedConditions.stalenessof 有什么区别
- java - Math.log 和 Math.pow 表达式的问题
- php - Youtube API - 确定是否有人开始/结束观看视频