Lua中对元表的理解

原先学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方法

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值