lua的metatable简介

metatable基本定义
从lua的 metatable官方解释 中我们可以得到如下信息:
1. 每个table和每个full user data都可以有自己的metatable,并可通过setmetatable和getmetatable进行访问
2. 其他任何lua类型,每种类型共享一个metatable;比如number类型共享一个metatable;string类型共享一个metatable;这些类型的metatable无法更改,除非用C API
3. metatable的key叫事件(event),value叫元方法(metamethod)
4. 除了__index,__newindex可以是function或table外,其他元方法都必须是function

__call元方法释义
当我们写下a(b,c )时,若a不是函数,那么a.metatable.__call(a, ...)将调用:
meta = {}
meta.__call = function(a, b, c) print(a, b, c) end

a = {}
setmetatable(a, meta)

a(10, 11)

__gc元方法释义
注意__gc元方法只对full user data有效

__tostring元方法释义
当调用tostring(a)时,若a不是string,那么a.metatable.__tostring(a)将调用;事实上print会调用tostring
meta = {}
meta.__tostring = function(a) return "a" end -- 必须返回一个字符串

a = {}
setmetatable(a, meta)

print(a)


禁止目标的metatable被修改
setmetatable/getmetatable函数也会使用metafield,在这种情况下,可以保护metatables。假定你想保护你的集合使其使用者既看不到也不能修改metatables。如果你对metatable设置了__metatable的值,getmetatable将返回这个域的值,而调用setmetatable 将会出错:
meta = { __metatable = "not your business" }
a = {}
setmetatable(a, meta) -- ok & metatable protected
print(getmetatable(a)) -- not your business
setmetatable(a, {})    -- error!!!

输出如下:
not your business
lua: .\a.lua:5: cannot change a protected metatable
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值