1

以下是读取带有单词索引的表的 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

输出:每次以不同的顺序

4

3 回答 3

3

这是Lua 5.2.1的特殊功能
:-) 但是这个功能是为了什么而引入的?
无论如何,您不应该依赖pairs函数生成的排序。


编辑:
引入此功能是为了对抗使用 Lua 的 Web 服务器上的哈希冲突攻击。
随机散列算法可防止轻松生成具有相等散列的字符串。
函数生成的表键的顺序pairs取决于字符串类型键的字符串哈希,因此字符串键碰巧在每次程序运行时都混淆了。

于 2013-04-08T07:09:42.910 回答
3

来自Lua PiL上的迭代器:

迭代表中所有元素的pairs函数是类似的,除了迭代器函数是下一个函数,它是 Lua 中的原始函数:

function pairs (t)
  return next, t, nil
end

调用 next(t, k),其中 k 是表 t 的键,以任意顺序返回表中的下一个键。(它还返回与该键关联的值,作为第二个返回值。)调用 next(t, nil) 返回第一对。当没有更多对时,next 返回 nil。

以及状态的枚举next

next (table [, index])

未指定枚举索引的顺序, even for numeric indices。(要按数字顺序遍历表,请使用数字 for 或 ipairs 函数。)

于 2013-04-08T09:53:56.003 回答
0

正如 Egor 所说,pairs 迭代器以任意顺序返回表值。要对数据进行排序并以序列格式返回,您需要使用 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: 遍历表中的所有对。

于 2013-04-08T07:30:05.557 回答