Lua元表应用汇总

真的是好久好久没有写过东西了。= 。=

元表是Lua里头一个很强大的特性,有了它,可以自定义扩展出很多本身Lua并不原生支持的东西。所以其实一直都想做一个关于元表应用的汇总,趁着过年这点闲暇,暂且汇总下目前所了解的一些,也权当抛砖引玉吧。

重载算术运算符


这个没什么好说的,也算是元表的最初级运用了,具体应用见Lua手册中的介绍。

Cache表


这个也属于元表的基本运用,没什么好说的,通过弱引用来做一个Cache缓存。

只读表


通过实现__index和__index元方法,来实现对一个表的只读访问(这里的实现只针对一层表结构)

实现面向对象


这个之前有专门写过,参见

一个完整的Lua版OOP示例

简单使用Lua实现类的继承

共享表数据


有时候我们可能需要这样一个表参数传递,表里大部分数据是固定的,但是部分数据是动态创建的,如果每次都全部重新创建一遍就比较浪费,于是可以将固定数据做成一张表,然后每次创建新表使其可以共享这个固定数据表里的数据,新表内部只包含那些动态的数据。


以上的都是比较常见的一些应用,下面的这些也许就比较“冷门”了,至少我第一次接触的时候是觉得很“黑科技”的。

带功能的函数


这个主要运用了__call函数,用一个表来扩展原有函数,从而来实现带记忆(对运行过的输入参数保存结果,下次同样的参数传递进来可直接返回结果,达到优化效率的目的,这里也应用了上述的Cache表)。且此表可直接对原有函数进行替换,并可附加清除记忆功能。

为函数添加标签


这里也是通过__call将函数转换为可执行表,然后在其元表中加入一个标签来为此函数添加标签,同时新生成的函数可以与原函数完美替换。

统计函数运行信息


这个跟上面的类似,还是利用__call将函数转换为可执行表,向其元表中添加统计记录,并在函数运行时统计信息,最后再通过GetStatInfo来查看此函数的运行信息,这样在我们需要对某些函数做性能统计时,就不用修改原函数或者全盘查找替换了。

Lua装饰器


其实上面几个应用在其他语言里(比如Python)都可被称为装饰器(Decorator),并且为其提供了一些语法糖,这里我们也利用Lua的元表为其做了一个类似的语法糖(使用 .. 运算符),并用这个语法糖将以上几个函数修改了下。

先看最终效果:

这里首先我们用统计函数来修饰原函数,用于统计原函数真正的运行次数,然后为这个函数加上记忆函数功能使其相同输入参数时仅须运行1次,最后加上标签foo_final, 为这个最终函数打上标记。

最终运行结果显示,一切符合预期。

最后附上各个装饰器的实现:

以及最后用于生成装饰器的函数实现:

其实有了这个装饰器,就可以使用Lua去做所谓的面向切面的编程(Aspect-Oriented Programming)了,能做的事情就远不止上面提到的那几种,只是上面几个我个人比较常用而已。
最后,元表的世界好奇妙,哈哈。

 

欢迎关注微信公众号:Lua爱好者