Lua Table pairs输出顺序问题 (版本差异 解决数字索引间断并兼容字符串索引)
问题标签:
Lua table pairs;Lua table 迭代器;Lua table 遍历顺序;Lua table 数字索引 字符串索引;
问题背景:
使用pairs输出table时,当一部分数字索引连续时,我们通常认为这一部分会按顺序遍历.
实际情况是在低版本Lua中不按顺序遍历,而高版本Lua中却会按顺序遍历.造成了版本差异,与通常认知不相符.
例如使用pairs输出如下table
T = {
[] = "",
[] = "",
[] = "",
[] = "",
[] = "",
[] = "",
[] = "",
[] = "",
[] = "",
[] = "",
[] = "",
[] = "",
[] = "",
q = "",
[] = "",
w = "",
[] = "",
e = "",
r = "",
t = "",
y = "",
}
for k,v in pairs(T) do
print(k)
end
我们通常认为:输出结果会是先顺序输出12345,再乱序输出其它
但是恰巧 在lua 5.1.5 都是乱序

经测试在lua 5.1.5,如果想与通常认为相符,那么就不能显式指定索引值,只能隐式指定索引值,就是把上述table改成这样:
T = {
"",
"",
"",
"",
"",
[] = "",
[] = "",
[] = "",
[] = "",
[] = "",
[] = "",
[] = "",
[] = "",
q = "",
[] = "",
w = "",
[] = "",
e = "",
r = "",
t = "",
y = "",
}
但是这种解决办法,显然让人无法接受,让人窒息.所以今天研究了一下解决办法
目标:
使用迭代器输出Table时,首先顺序输出数字索引(允许数字索引间断),最后输出字符串索引
问题解决:
灵感来源于<Programming In Lua>中的代码:
function pairsByKeys(t)
local a = {} for n in pairs(t) do
a[#a + ] = n
end table.sort(a) local i = return function()
i = i +
return a[i], t[a[i]]
end
end for key, value in pairsByKeys(表) do end
但是这个还差点意思,当table中包含字符串索引时,会报错.我们期望能和pairs一样兼容字符串索引.我们强化一下,如下:
function spairs(t)
local num_key_table = {}
local string_key_table = {} for k,v in pairs(t) do
if type(k) == "number" then
num_key_table[#num_key_table + ] = k
else
string_key_table[k] = v
end
end table.sort(num_key_table) local i = return function()
if i < #num_key_table then
i = i +
return num_key_table[i], t[num_key_table[i]]
else
for k,v in pairs(string_key_table) do
string_key_table[k] = nil
return k,v
end
end
end
end for k,v in spairs(T) do
print(k)
end
5.27 修改:
function spairs(t)
local num_key_table = {}
local str_key_table = {}
for k,v in pairs(t) do
if type(k) == "number" then
num_key_table[#num_key_table + ] = k
else
str_key_table[#str_key_table + ] = k
end
end table.sort(num_key_table) local num_index =
local str_index =
return function()
if num_index < #num_key_table then
num_index = num_index +
return num_key_table[num_index], t[num_key_table[num_index]]
elseif str_index < #str_key_table then
str_index = str_index +
return str_key_table[str_index], t[str_key_table[str_index]]
end
end
end
对比:

还有改进的地方,欢迎指导
Lua Table pairs输出顺序问题 (版本差异 解决数字索引间断并兼容字符串索引)的更多相关文章
- lua table remove元素的问题
当我在工作中使用lua进行开发时,发现在lua中有4种方式遍历一个table,当然,从本质上来说其实都一样,只是形式不同,这四种方式分别是: for key, value in pairs(tbtes ...
- Lua table笔记
记录我在使用lua的过程中的一些笔记 默认key为数字递增 local tb={"A",[3]="C","B"} 这个tb通过下标1,2,3 ...
- lua中pairs 和 ipairs 的区别
1.table中存储值的时候,是按照顺序存储的,存储 k-v 的时候,是按照 k 的哈希值存储的. 2.ipairs --- 只能输出 table 中的值,并且不可输出nil,遇到 ni l就退出 p ...
- Lua 学习之基础篇四<Lua table(表)>
table 是 Lua 的一种数据结构用来帮助我们创建不同的数据类型,如:数组.字典等. Lua table 使用关联型数组,你可以用任意类型的值来作数组的索引,但这个值不能是 nil. Lua ta ...
- Lua中 pairs和ipairs的区别
Lua系列–pairs和ipairsLua中Table的存储方式在看二者的区别之前,我们首先来看一下Lua中的table是如何在内存中进行分配的.Table的组成:1.哈希表 用来存储Key-Valu ...
- lua中pairs和ipairs的区别
标准库提供了集中迭代器,包括迭代文件每行的(io.lines),迭代table元素的(pairs),迭代数组元素的(ipairs),迭代字符串中单词的 (string.gmatch)等等.LUA手册中 ...
- lua 中pairs 和 ipairs区别
lua 中pairs 和 ipairs区别 标准库提供了集中迭代器,包括迭代文件每行的(io.lines),迭代table元素的(pairs),迭代数组元素的(ipairs),迭代字符串中单词的 (s ...
- Lua table pair和ipair区别
官方描述: ipairs (t) Returns three values: an iterator function, the table t, and 0, so that the constru ...
- Lua table使用
days = {"Sunday", "Monday", "Tuesday", "Wednesday", "Th ...
随机推荐
- VisualStudioCode通过SSH远程编辑文件
翻译修改自:https://codepen.io/ginfuru/post/remote-editing-files-with-ssh 在远程服务器上编写文件是一件很糟糕的事情,vim和其他终端编辑器 ...
- if分支判断
# 控制语句 分支 循环语句 # 判断语句 if ..elif..else # if 条件语句(比较 逻辑 成员运算) # 空数据 == False # 非空数据 == True age = 20 i ...
- 遗弃.Forsaken.2015.BluRay.720p.x264.DTS-beAst
◎译 名 遗弃/落日孤影(台)/赎罪◎片 名 Forsaken◎年 代 2015◎产 地 加拿大/法国/美国◎类 别 剧情/西部◎语 言 英语◎上映日期 2015-09-16(多伦多电影节)/2016 ...
- Qt类声明中Q_OBJECT的作用与报错解决
2017-06-22 周四 大雨 北京 院里 新建作图类,继承自QCUstomPlot类 因为需要同时作8张图,都要单坐标缩放的功能,因此想干脆新建一个类,继承自QCUstomPlot,把需要的功能都 ...
- 阿里为何要用独立APP挖微信微商墙角?
微商,这个被很多人看来是逃离马云魔咒,和淘宝抗衡的电商模式,自诞生到狂飙就伴随着种种争议.由于传播效率极强,在很长时间里也一直是不少人口中津津乐道的神话故事和救市良方.以至于,淘宝推出各种手段封杀 ...
- js面试-手写代码实现new操作符的功能
我们要搞清楚new操作符到底做了一些什么事情? 1.创建一个新的对象 2.将构造函数的作用域赋给新对象(因此this指向了这个新对象) 3.执行构造函数中的代码(为这个新对象添加属性) 4.返回新对象 ...
- css中grid属性的使用
grid布局 加在父元素上的属性 grid-template-columns/grid-template-rows 定义元素的行或列的宽高 如果父元素被等分成了9等分,则,不管有多少个子元素,都显示9 ...
- 神奇的background——绘制图形
相信大家在平时工作中少不了会被要求在某些元添加一些特殊的背景图片,这时候通常就拿起ps就是切切切.不说这种方式麻烦,有ui给你切好的情况已经不错,没有的就有自己动手.还可能有需要切一整张超大图的情况. ...
- 利用ajax 引入静态页公共的头部与底部
利用ajax引入公共的头部与底部或者多个页面需要用到的重复的组件,对于新入门的前端来说是很实用的方法,自己也是新手菜鸟一枚,折腾了好久,实现的方法有很多种,这是我个人觉得比较简单方便的 首先得把公用的 ...
- iview 和 Elemet UI 源码比较
(近期给自己立了个小flag,读源码,每周至少读1篇源码) 下面来谈谈iview 和 Elemet UI 这两个基于Vue 的UI 框架源码的基本结构以及区别. 一.文件结构开发主要放在根文件夹下的s ...