原先学lua的时候就对元表一知半解,这次重新学习记录下,一下皆是自己通过理解总结的东西
1.元表
元表是什么
个人理解元表就相当于另一个表的扩展,可以改变对应表中的行为,加减输出什么的
怎么设置元表
mytable = {} -- 普通表
mymetatable = {} -- 元表
setmetatable(mytable,mymetatable) -- 把 mymetatable 设为 mytable 的元表
以上取自菜鸟教程
这里是说将mymetatable设为了mytable的元表,也就是mymetatable是对mytable表的一个扩展内容,所以最后setmetatable这个方法有返回值,返回的还是mytable这个表
2.元方法之__index
调用时机
如果我们访问一个表中的键不存在,那么将会调用__index中的内容
other ={foo = 3}
othermetatable = {
__index = function(other,key) --other 为other表,key为访问的键
print("执行了__index的方法,传入的键为:" ..key)
if(key == "n") then
return "nnn"
end
end
}
other = setmetatable(other,othermetatable)
print(other.n)
输出内容:
执行了__index的方法,传入的键为:n
nnn
3.元方法之__newindex
调用时机
当我们添加或者修改表中新的数据的时候就会调用这个__newindex中的内容
other ={foo = 3}
othermetatable = {
--other 为other表,key为访问的键,value为要修改的值
__newindex = function(other,key,value)
print("执行了__newindex的方法,传入的键为:" ..key.."\n改变的值为:"..value)
--rawset(other,key,value) --在表中赋值操作
end
}
other = setmetatable(other,othermetatable)
other.foo =33
other.foo1 =4
print(other.foo)
print(other.foo1)
print("如上当新键赋值之后表中还是没有这个键值对的,我们需要调用函数rawset进行赋值")
执行了__newindex的方法,传入的键为:foo1
改变的值为:4
33
nil
如上当新键赋值之后表中还是没有这个键值对的,我们需要调用函数rawset进行赋值
当rawset取消注释执行的时候,输出other.foo1 = 4
4.表之间的运算
相加__add
在__add方法中写入需要进行的操作,这里将第二个表的只加到了第一个表中,如果不是键值对是数组那样的还需要计算缩影位置添加
other ={foo = 3}
othermetatable = {
--两个表相加操作__add,参数为当前表和要加上的表
__add = function (other,secondtable)
--插入第二个表的数据
for i,v in pairs(secondtable) do
other[i] = v
end
return other
end
}
other = setmetatable(other,othermetatable)
secondtable = {a = 1,b = 2}
--这里需要赋值给一个新的变量
newtable = other+secondtable
print(newtable.a)
print(newtable.b)
1
2
当然加减乘除操作都有,不过应该都是对应数组那样的操作,例如a={1,2,3,4}这样的,表中有键值对的会报错
5.元方法之__call
调用时机
当表作为一个方法被调用的时候会被访问
other ={foo = 1}
othermetatable = {
--两个表相加操作__add,参数为当前表和传入的参数,参数可扩展arg[]...
__call = function (other,arg)
print(arg)
end
}
other = setmetatable(other,othermetatable)
--这里other表被当做了一个方法执行,传入23参数
print(other(23))
输出23
6.元方法之__tostring
调用时机
当我们将表输出的时候,例如print(other),正常情况下我们会得到这个表的地址,但是里头有__tostring时就会让你输出一个字符串
other ={foo = 3}
othermetatable = {
--输出操作__tostring,参数为当前表
__tostring = function (other)
return "这里执行了tostring方法"
end
}
other = setmetatable(other,othermetatable)
print(other)
这里执行了tostring方法