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 ...
随机推荐
- 解决android 无法打开 DDMS 中的data目录
把上面操作一遍就可以了,如果还是不行你可以检查下 su 是不是输入错误了.
- Win10下JDK环境搭建的两种方法
jdk1.8--64位官网下载的百度网盘 https://pan.baidu.com/s/1A7jYfupwMWZawb5z_RSdJg 提取码: 92eu 第一种方法(建议) 变量名: ...
- Python知识点总结及其介绍链接
Python 弱引用(不会增加引用计数的引用,可以用来做对象缓存,避免循环引用导致内存无法回收):http://python.jobbole.com/85431/ from future import ...
- Runtime常见使用
一些语法 更改对象的类/获取对象的类 1234 CustomClass *class1 = [[CustomClass alloc]init];Class aclass =object_setClas ...
- 高阶函数---swift中的泛型介绍(一步步实现Map函数)
说明 本文内容均出自函数式 Swift一书, 此处整理仅仅是为了自己日后方便查看, 需要深入研究的话, 可以点进去购买, 支持原作者 本书由 王巍–新浪微博大神翻译 OneV's Den 喵神博客 接 ...
- C++中如何对单向链表操作
*/ * Copyright (c) 2016,烟台大学计算机与控制工程学院 * All rights reserved. * 文件名:text.cpp * 作者:常轩 * 微信公众号:Worldhe ...
- ZYNQ自定义AXI总线IP应用——PWM实现呼吸灯效果
一.前言 在实时性要求较高的场合中,CPU软件执行的方式显然不能满足需求,这时需要硬件逻辑实现部分功能.要想使自定义IP核被CPU访问,就必须带有总线接口.ZYNQ采用AXI BUS实现PS和PL之间 ...
- py函数式编程
函数式编程把计算视为函数而非指令,纯函数式编程不需要变量,没有副作用,测试简单,python支持的函数式编程不是纯函数式编程,允许有变量存在,支持高阶函数,支持闭包,有限度的支持匿名函数 变量可以指向 ...
- [红日安全]Web安全Day9 - 文件下载漏洞实战攻防
本文由红日安全成员: Once 编写,如有不当,还望斧正. 大家好,我们是红日安全-Web安全攻防小组.此项目是关于Web安全的系列文章分享,还包含一个HTB靶场供大家练习,我们给这个项目起了一个名字 ...
- .netCore下的jwt的梳理-->借鉴于“老张的哲学”
之前在公司的项目中有用到jwt进行token验证,但是公司里用的框架已经集成好了jwt,所以对jwt的的了解不够清晰,感觉还是隔着一层.在看了“老张的哲学”的jwt部分后对jwt的认识才更加深刻了一些 ...