以下是用于读取带有单词索引的表的lua代码。 将其读入另一个表并在输出中打印它会在每次运行时产生随机顺序。
earthquakes = {
date8 = "1992/01/17",
date7 = "1971/02/09",
date6 = "2010/04/04",
date5 = "1987/10/19"
}
sf = string.format
earthquake_num ={}
for k, v in pairs(earthquakes) do
table.insert(earthquake_num, {key=k,value=v})
end
for i, v in pairs (earthquake_num) do
print(sf(" row %d key = %s", i, v.value))
end
输出: 每次都以不同的顺序
答案 0 :(得分:2)
这是Lua 5.2.1的special feature :-)
但是这个功能的用途是什么呢?
无论如何,您不应该依赖pairs
函数生成的排序。
编辑:
引入此功能是为了在使用Lua的Web服务器上对抗hash collision attacks
随机哈希算法可以防止使用相等的哈希值轻松生成字符串
由pairs
函数生成的表键的排序取决于字符串类型键的字符串哈希,因此字符串键恰好在每次程序运行时都会混淆。
答案 1 :(得分:2)
来自Lua PiL的迭代器:
迭代表中所有元素的
pairs
函数是 类似的,除了迭代器函数是下一个函数,其中 是Lua中的一个原始函数:function pairs (t) return next, t, nil end
调用next(t,k),其中k是表t的键,返回下一个键 在表格中, 以任意顺序 。 (它还返回 与该键关联的值,作为第二个返回值。)调用 next(t,nil)返回第一对。当没有更多配对时,接下来 返回nil。
next
状态的枚举:
next (table [, index])
未指定枚举索引的顺序, 的
even for numeric indices
即可。 (要按数字顺序遍历表,请使用数字或ipairs函数。)
答案 2 :(得分:0)
正如Egor所说,对迭代器以任意顺序返回表值。要对数据进行排序并以有序格式返回,您需要使用ipairs,例如
earthquakes = {
date8 = "1992/01/17",
date7 = "1971/02/09",
date6 = "2010/04/04",
date5 = "1987/10/19"
}
sf = string.format
earthquake_num ={}
for k, v in pairs(earthquakes) do
table.insert(earthquake_num, {key=k,value=v})
end
table.sort(earthquake_num,function(a, b) return a.value < b.value end)
for i, v in ipairs (earthquake_num) do
print(sf(" row %d key = %s", i, v.value))
end
有关详细信息,请参阅lua: iterate through all pairs in table。