学习笔记 --lua 元表 metatable

元表的基本概念: metatable 元表是table 预定义的一系列操作。 例如 将两个table相加,Lua会先去检查这两个table是否有metatable。然后再检查metatable中是否有__add方法。如果其中一个有则按__add中的方法来执行,都没有则报错。

-- Lua中的每一个值都有或者可以有一个元表。在我的理解中,元表可以是函数,也可以是自定义的属性(修正:在设置元表时一般都是传入方法,根据预定义操作这句话的理解。 而我理解的属性,是在__index方法中的)。

-- 注意: Lua在新建的table的时候是不会创建元表的,需要使用setmetatable方法设置元表。

setmetatable(a,b) ------a是需要设置元表的对象, b是元表的值(可以是任何值)

getmetatable(a) ----- 可以查询a是否有元表。

 

例子:

Bag = {}

function Bag.new(x)

   local bag = {}

   for i,v in ipairs(x) do

      bag[v] = v

   end

----这里开始为Bag的实例对象设置元表。设置的元表是一个方法, 名字为__add---------方法的行为是addmeta函数内的操作

   Bag.mymetatable = {}

   Bag.mymetatable.__add = Bag.addmeta

  setmetatable(bag,Bag.mymetatable)

   return bag

end

 

function Bag.addmeta(a,b)

    local outTable = Bag.new({})

    for i,v in pairs(a) do

       outTable[v] = v

    end

    for i,v in pairs(b) do

       outTable[v]= v

    end

    return outTable

end

 

local a = Bag.new({1,2,3,4}) --{1,2,3,4}

local b = Bag.new({5,6,7,8})--{5=5,6=6,7=7,8=8}

local mt = getmetatable(a) --__add:function: 0x14014e40

local mt = getmetatable(b) --__add:function: 0x14014e40

local c = a+b

printt(c)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值