表格函数 |
|
do local meta = {__call = function(t, ...) return t.__function(t, unpack(arg)) end } function Tablefunc(fn) return setmetatable({__function = fn}, meta) end end
Tablefunc 的结果是一个具有调用语义的表格,但函数有一个隐式的第一个参数,即它自己的表格,它可以在其中存储持久状态。
我知道你在想什么。所以呢?这只是一个没有键的标准对象调用。如果我想拥有私有持久状态怎么办?好的,看看 TableFuncsTwo
同时,这里有一个快速而愚蠢的例子
repeater = Tablefunc( function(self, n, str) -- I've got persistent state variables self.times_called = (self.times_called or 0) + 1 -- I can get at the base function and even change it -- so it will do something different next time if self.times_called >= 99 then self.__function = function() return "Sorry, I'm tired of repeating myself" end end -- I can use the table for configuration, and -- the functable itself is self, so I can recurse if n == 0 then return "" elseif n == 1 then return str else return str .. (self.delim or ", ") .. self(n - 1, str) end end)
强制性的示例运行
$ lua Lua 5.0 (beta) Copyright (C) 1994-2002 Tecgraf, PUC-Rio > -- I can get at the state variables from here, too > repeater.delim = "; " > print(repeater(7, "hello")) hello; hello; hello; hello; hello; hello; hello > print(repeater.times_called) 7 > _ = repeater(90, "hello") > print(repeater.times_called) 97 > print(repeater(7, "hello")) hello; hello; Sorry, I'm tired of repeating myself
--RiciLake
function wrap(fn) local t = {} return function(...) return fn(t, ...) end, t end
local states = setmetatable({}, {__mode = "kv"}) function addstate(fn) local t = {} local fn2 = function(...) return fn(t, ...) end states[fn2] = t return fn2 end function getstate(fn) return states[fn] end