lua 元表

Lua 中的 table 由于定义的行为,我们可以对 key-value 对执行加操作,访问 key 对应的 value,遍历所有的 key-value。但是我们不可以对两个 table 执行加操作,也不可以比较两个表的大小。 Metatables允许我们改变 table 的行为,例如,使用 Metatables我们可以定义 Lua 如何计算两个 table 的相加操作 a+b。当 Lua 试图对两个表进行相加时,他会检查两个表是否有一个表有 Metatable,并且检查 Metatable 是否有__add 域。如果找到则调用这个__add函数(所谓的 Metamethod)去计算结果。

t = {}  
  
m = { a = " and ", b = "Li Lei", c = "Han Meimei" }    
setmetatable(t, { __index = m})  --表{ __index=m }作为表t的元表    
  
  
for k, v in pairs(m) do  --穷举表m    
  print(k, v)    
end      
print("-------------")    
for k, v in pairs(t) do  --穷举表t,无输出    
  print(k, v)    
end  
print("-------------")    
print(t.b, t.a, t.c)
 
  
print("-------------")    
print(m.b, m.a, m.c)

输出

>lua -e "io.stdout:setvbuf 'no'" "a.lua" 
a and 
c Han Meimei
b Li Lei
-------------
-------------
Li Lei and Han Meimei
-------------
Li Lei and Han Meimei
>Exit code: 0


元表作为运算符重载:

function add(t1, t2)
  --‘#’运算符取表长度
  assert(#t1 == #t2)
  local length = #t1
  for i = 1, length do
    t1[i] = t1[i] + t2[i]
  end
  return t1
end

--setmetatable返回被设置的表
t1 = setmetatable({ 1, 2, 3}, { __add= add })
t2 = setmetatable({ 10, 20, 30 }, {__add = add })

t1 = t1 + t2
for i = 1, #t1 do
  print(t1[i])
end

从而能够做加法运算。


                
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值