[lua] metatable学习小结

1060阅读 0评论2014-09-01 areece
分类:嵌入式

table对象有metatable。metatable中的方法控制在特定情况下的行为,如
    控制算术运算与逻辑运算的
    控制字符串打印的__tostring及连接操作符..的__concat
    控制length操作符#的__len
    控制被调用时的__call
    控制访问不存在的域__index, __newindex。

一般情况下,玩的最多的就是__index域,因为这也是基于protocol的继承机制。__index metamethod即可以是一个函数,也可以是一个表。

默认值例子的说明
    默认值可以存在每个表的metatable中,这样每个表的metatable都不一样。
    默认值直接存在每个表的某个域中,这样,所有的表都可以共享metatable。但是这样,缺少值就不可以共享了。
    默认值按照table为key保存在一个单独的table中,这样,所有的表都可以共享metatable与default值。

监控与代理表的说明
    基本原理是给用户返回一个proxy table,proxy table的__index与__newindex方法做尽功课之后,再访问原表。
    proxy table引用原表的方法与前面默认值的保存比较类似。
          每个proxy table都有一个不同的metatable,这样随便保存(包括使用upvalue也可以)。
          共享metatable,把原表保存在proxy table中(只要使用一个不冲突的域就可以了)。
   
上一篇:[lua] coroutine学习小结
下一篇:[编码] 条形码