元表作用
元表扩展普通表
举例:如果A+B两个表相加,如果不设置元表的话就会报错,这种情况就可以设置元表来实现,就类似C++的友元函数这种概念
元表设置
1 | mymetable = {} |
设置失败情况
当元表有_metatable键值则设置失败
tab = setmatatable({},{_metatable=”sdfsd”})
如果元表设置了这个键值,则getmetatable方法只会返回这个_metatable的值,这样会保护元表使得外界获取不到并且不能修改元表
元表__index元方法
当通过键来访问table的时候,如果这个键不存在则lua会寻找该table的metatable中的index键,如果index包含一个table,则会在表格中查找对应的键
1 | mytable = {"LUA","Java", "C#"} |
注释:key就是访问mytable的key
元方法__index还可以设置一个表格
1 | mytable = {"LUA","Java", "C#"} |
元表__newindex元方法
__newindex添加新的数据才会起作用,如果修改已经存在的key不会起作用,他也可以设置表或者数据
1 | mytable = {"LUA","Java", "C#"} |
为表添加操作符
1 | mytable = {"LUA","Java", "C#"} |
还有其他操作符方法
- __add +
- __sub -
- __mul *
- __div /
- __mod %
- __eq ==
- __lt <
- __le <=
元表__call元方法
将表当做方法使用会触发__call方法
1 | mytable = {"LUA","Java", "C#"} |
元表中的__tostring的作用
打印table时候调用
1 | mytable = {"LUA","Java", "C#"} |