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中(只要使用一个不冲突的域就可以了)。
阅读(972) | 评论(0) | 转发(0) |