谷歌拼音扩展 LUA 中的 orderedPairs谷歌拼音扩展 LUA 中的 orderedPairs

今天在写谷歌拼音扩展,希望给出的候选词能按照数字顺序排列,而我在源文件中 tablekey 已经按顺序写了,可输出仍然是乱序。于是去官网查了点资料,发现一段代码:

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50
--[[
Ordered table iterator, allow to iterate on the natural order of the keys of a
table.
Example:
]]
function __genOrderedIndex( t )
local orderedIndex = {}
for key in pairs(t) do
table.insert( orderedIndex, key )
end
table.sort( orderedIndex )
return orderedIndex
end
function orderedNext(t, state)
-- Equivalent of the next function, but returns the keys in the alphabetic
-- order. We use a temporary ordered key table that is stored in the
-- table being iterated.
--print("orderedNext: state = "..tostring(state) )
if state == nil then
-- the first time, generate the index
t.__orderedIndex = __genOrderedIndex( t )
key = t.__orderedIndex[1]
return key, t[key]
end
-- fetch the next value
key = nil
for i = 1,table.getn(t.__orderedIndex) do
if t.__orderedIndex[i] == state then
key = t.__orderedIndex[i+1]
end
end
if key then
return key, t[key]
end
-- no more value to return, cleanup
t.__orderedIndex = nil
return
end
function orderedPairs(t)
-- Equivalent of the pairs() function on tables. Allows to iterate
-- in order
return orderedNext, t, nil
end

只需要用 orderedPairs() 代替掉 pairs() 即可,但是后来发现我的扩展中若嵌入这么大一段代码,大小就太大了,于是就打算精简下。联想到 .Net 程序的混淆器,我如法炮制,将所有变量名全部混淆,于是得到了下面的代码:

1
_0=pairs function _1(_6)local _2={}for _4 in _0(_6)do table.insert(_2,_4)end table.sort(_2)return _2 end function _3(_6,_5)if _5==nil then _6._7=_1(_6)_4=_6._7[1]return _4,_6[_4]end _4=nil for _8 = 1,table.getn(_6._7)do if _6._7[_8]==_5 then _4=_6._7[_8+1]end end if _4 then return _4,_6[_4]end _6._7=nil return end function _9(_6)return _3,_6,nil end pairs=_9

嗯,你应该看出来了我直接将 pairsorderedPairs(这里其实是 _9)覆盖了。

总之,这个对于平常的开发是无用的,但是对于谷歌拼音扩展则是十分有用。你要是喜欢,欢迎随便转载。我已经提交到官方 wiki 去了。

Version History版本历史

  • 0143959 I18N changes: Add language field to posts
  • 4a8e516 Rename categories: stuff -> data, coding -> tech
  • 5b93ba5 Remove author & delete some broken posts
  • 1ee024d Import posts from my WordPress blog