WoW 2.0 中的Lua解释器更新到了Lua 5.1, '...' 语句较以前(Lua 5.0前)变的更强大而节省内存. 这里有一些新的使用方法.
Hooking
在以前, '...' 语句在调用时会创建一个名为'args' 的表. 在内存中创建了一个表会可能引发垃圾回收. 这是一个缺陷:
local f = somefunc somefunc = function(...) -- do some crap return f(unpack(args)) end
如果上面这个函数被频繁调用将对性能造成很大影响. 而在Lua 5.1 中这样使用hook将不会造成内存浪费.
local f = somefunc somefunc = function(...) -- do some crap return f(...) end Post - hooks
这个新功能同样允许创建一个漂亮的post-hook. 这个例子中, 我们需要第一个参数被传入, 并且需要完整的原始参数列表和完整的原始返回值. 可以参考如何安全的Post-Hook一个函数
local f = somefunc local ph = function(a1, ...) -- do something with a1 return ... end somefunc = function(a1, ...) return ph(a1, f(a1, ...) end
迭代
和hooking一样, 迭代同样会创建表而浪费内存, 在Lua 5.1 中变的就更干净了.
function f(...) for i = 1 ,select( " # " , ...) do local x = select(i, ...) -- do something with x end end
译注: 通过select("#", ...)这样的语法可以取到参数的个数, 通过select(i, ...)取到第i个参数.
递归
'...' 使递归变的更整齐
function r(x, ...) local y = x * x if select( " # " , ...) > 0 then return y, r(...) else return y end end