魔兽地图编辑器吧 关注:64,949贴子:3,835,212
  • 7回复贴,共1

lua 中的 paris 乱序导致异步问题

只看楼主收藏回复

在 jass2lua 说明中提到可以使用 gchash 来固定输出顺序

但这个函数目前已经被移除了,变为了空函数


先排序后遍历的话效率太差了,求教有什么好的办法解决这个问题吗


IP属地:福建1楼2019-07-19 20:50回复
    一个简单的办法,多写一个遍历专用的数组表,用 ipairs 遍历。


    IP属地:河北2楼2019-07-19 21:36
    收起回复
      自己排序,别用lua的排序


      IP属地:北京来自Android客户端3楼2019-07-20 12:38
      回复
        魔兽不需要考虑效率,这点计算量


        IP属地:北京来自Android客户端4楼2019-07-20 12:38
        回复
          local tbl = {}
          local tbl_queue = {}
          for i = 1, 10 do
          local k = {id = i}
          tbl_queue[#tbl_queue + 1] = k
          tbl[k] = i
          end
          for _, v in ipairs(tbl_queue) do
          print(v.id, tbl[v])
          end
          大概意思就是这样。
          如果你坚持想用 pairs 的话,可以重写一下这函数,比如:
          local rawpairs = pairs
          function pairs(tb, func)
          if func == nil and type(tb._queue) == "table" then
          return ipairs(tb._queue)
          end
          return rawpairs(tb, func)
          end
          local tbl = {_queue = {}}
          function tbl.set(key, val) -- 之后为该表赋值时均使用此函数
          if tbl[key] and val == nil then
          for i = 1, #tbl._queue do
          if tbl._queue[i] == key then
          table.remove(tbl._queue, i)
          end
          end
          else
          tbl._queue[#tbl._queue + 1] = key
          end
          tbl[key] = val
          end
          -- 上面这种数组表结构完全可以扩展功能后再给写个构造函数,这里先简单写一下
          for i = 1, 10 do
          local k = {id = i}
          tbl.set(k, i)
          end
          for _, v in pairs(tbl) do -- 等价于 for _, v in ipairs(tbl._queue) do
          print(v.id, tbl[v])
          end


          IP属地:河北5楼2019-07-20 13:01
          收起回复