【问题标题】:Reading lua table with word index gives random order使用单词索引读取 lua 表给出随机顺序
【发布时间】:2013-03-30 03:35:00
【问题描述】:

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

输出: 每次都是不同的顺序

【问题讨论】:

    标签: lua indexing lua-table


    【解决方案1】:

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


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

    【讨论】:

    • 它可能被引入显式break任何依赖于特定顺序的代码。因此,不小心编写此类代码的人会得到不正确的行为并修复它。
    • @NicolBolas,这不是原因,但它确实有这种副作用,这很好。
    【解决方案2】:

    来自Lua PiL 迭代器:

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

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

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

    next 的枚举状态:

    next (table [, index])

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

    【讨论】:

      【解决方案3】:

      正如 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: iterate through all pairs in table 了解更多信息。

      【讨论】:

        猜你喜欢
        • 2017-10-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-11-21
        • 2015-07-28
        相关资源
        最近更新 更多