前言
Lua语言中的每种类型的值都有一套可预见的操作集合.例如,我们可以将数字相加,可以连接字符串,还可以在表中插入键值对等. 但是,我们无法将两个表相加,无法对函数做比较,也无法调用一个字符串,除非使用表.
元表和元方法
元表可以修改一个值在面对一个未知操作时的行为. 例如,a和b都是表,那么可以通过元表定义Lua语言如何计算表达式a+b.当lua试图将两个表相加时,它会先检查两者之一是否有元表且该元表中是否有__add字段.如果lua找到了该字段,就调用该字段对应的值,即所谓的元方法.
Note:
Lua中的每一个值都可以有元表.每一个表和用户数据类型都具有各自独立的元表,而其他类型的值则共享对应类型所属的同一个元表.(Lua在创建表时不带元表)
Lua中只能为表设置元表.如果要为其他类型的值设置元表,则必须通过C代码或调试库完成.
字符串标准库为所有的字符串都设置了同一个元表,而其他类型默认情况都没有元表.
t = {}
print(getmetatable(t)) -- nil
t1 = {}
setmetatable(t, t1) -- setmetatable函数用来设置或修改任意表的元素
print(getmetatable(t) == t1) -- true
that's all