天天看点

利用__index和__newindex实现默认值表、监控表、只读表(转)

__index和__newindex实际上相当于是在读写表的时候分别加了一道过滤的逻辑,让读写表的操作可以被监控或说回调,利用这个特性可以实现一些带有特殊功能的表。

  带有默认值的表:

利用__index和__newindex实现默认值表、监控表、只读表(转)
利用__index和__newindex实现默认值表、监控表、只读表(转)

  一般访问不存在的域会返回nil,但经过上面代码处理后,访问不存在的域会返回一个默认值。为了实现公用metatable,可以将代码封装如下:

  监控表(代理表):

利用__index和__newindex实现默认值表、监控表、只读表(转)
利用__index和__newindex实现默认值表、监控表、只读表(转)

  对上述代码进行一些适当的封装,将原始表作为代理表的一个特殊的域对应的值:

利用__index和__newindex实现默认值表、监控表、只读表(转)
利用__index和__newindex实现默认值表、监控表、只读表(转)

  只读表:

利用__index和__newindex实现默认值表、监控表、只读表(转)
利用__index和__newindex实现默认值表、监控表、只读表(转)

  上述利用__index和__newindex特性来实现的一些具有特殊表的方法都比较简单易懂,而且很好用。

http://www.cnblogs.com/sifenkesi/p/3837944.html