一、基础:Lua元表
1、元表目的:
对两个Table进行操作,从而改变Table的行为
栗子: 为了实现 使 表A和表B中元素互相加起来
Lua先检查任一表 是否有 元表;
接着检查是否有“_add”字段;
_add为 即时字段 对应着一个函数或者表, 我们称其对应的字段为元方法 键
处理 元表 的函数
1、setmetatable(table,metatable) // 对指定table设置元表,如果元表中_metatable即时字段的值,则函数会设置失败
2、getmetatable(table) //返回对象的元表
栗子:
test_table={} //普通的表
test_metatable={} //元表(空键值)
setmetatable(test_table,test_metatable) //把test_metatable设置成test_table的元素
或者直接写成
test_table=setmetatable({},{})
getmetatable(test_table) //返回值为test_metatable
3、常用的元方法
_index方法
当_index元方法是函数的时候:
当碰上以下的情况
local t={name = "zlk"}
print(t{money]); //返回了nil
local t={name="zlk"}
local mt={
_index=function(table,key)
print("未检测到您要搜索的字段:",key);
end
}
setmetatable(t,mt);
print(t[money]); //当调用了不存在的money字段时,就会调用table元表里的__index元方法,并且会传递table和字段名两个参数。
输出:
未检测到您要搜索的字段:money
nil
元方法是table的时候
local t={name="zlk"}
local mt={
_index={money="900,000"}
}
setmetatable(t,mt);
print(t[money]);
输出:
900,000
我们给_index赋值了一个table,其中table有 下标为money的元素900000;
那么,当调用t的某个不存在的字段时,就会去查找__index里的table,如果找到这个字段,就调用它。即以下步骤
1.在表中查找,如果找到,返回该元素,找不到则继续
2.判断该表是否有元表,如果没有元表,返回nil,有元表则继续。
3.判断元表有没有__index方法,如果__index方法为nil,则返回nil;如果__index方法是一个表,则重复1、2、3;如果__index方法是一个函数,则返回该函数的返回值。
由_index元方法到继承
local person={
name="zlk",age=22,money=9990000,
speak=function(param)
print("hello");
end
}
local t1={};
local t2={};
local mt={_index=person}
setmetatable(t1, mt);
setmetatable(t2, mt);
print(t1[money]);
t2.speak(); //不知道可不可以写成t2[speak()]
这里很容易理解 上述的继承关系了: t1和t2继承了mt的属性!!!
_newindex 元方法
_newindex方法用于对表的更新操作(_index用于对表的访问);
当要给表中缺少的索引赋值时,解释器首先就会查找_newindex方法;
栗子:
mt={};
t=setmetatable({key1="value1"},{_newindex=mt});
print(t[key1]); //value1
t[key2]="value2"
print(t[key2],mt[key2]); //nil , value2
t[key1]="v";
print(t[key1],mt[key1]); // v,nil
以上实例中表设置了元方法 __newindex,在对新索引键(key2)赋值时(t.key2 = “value2”),会调用元方法,而不进行赋值。而如果对已存在的索引键(key1),则会进行赋值,而不调用元方法 __newindex