Lua-元表,方法

数组

一般以1为起始索引,因为Lua库和长度操作符都遵循这个约定,如果数据不是从1开始,就无法试用这些功能

元表

假设a和b都是table,通过元表可以定义计算表达式 a + b,当Lua试图将两个table相加时,它会先检查两者之一是否有元表,然后检查该元表中是否有一个叫 __add的字段,一般是方法。如果Lua找到了该字段,就调用该字段对应的值,这个值就是所谓的“元方法”。

local meta = {
    __add = function()
        print("123")
    end
}

local a = {}
setmetatable(a, meta)

local b = {}

local c = a + b  -- 123

“__add" = 加法
“__mul” = 乘法
“__sub” = 减法
“__div” = 除法
“__unm” = 相反数
“__mod” = 取模
“__pow” = 乘幂
“__concat” = 连接操作符的行为

关系类的元方法

“__eq"等于,”__lt"小于,"__le"小于等于,其它3个关系操作符没有单独的元方法,lua将 a ~= b 转换为 not (a==b),以此类推, 大于 a > bnot (a <=b)
这种转换遇到”部分有序“就会发生错误,指对一种类型而言,不是所有的值都能排序,比如计算机中的 NaN 值,标准规定了任何涉及 NaN的比较都应返回 false,即 x > NaN 或 x <= NaN 都是 false

保护元表

假设想要保护集合的元素,使用户既不能看也不能修改集合的元素,就需要用到字段"__metatable",当设置了该字段时, getmetatable就会返回这个字段的值,setmetatable则会引发一个错误

__index

访问一个table 中不存在的字段时,解释器会去查找一个叫__index 的元方法,如果没有,则为nil,否则,则由这个元方法提供最终结果,_index 不一定是一个方法,也可以是一个 table ,当为table时,访问一个不存在的变量会先找到 _index , Lua就会在这个table里继续查找
不想在访问一个table 时涉及到它的__index元方法,则可使用函数 rawget( t , i )

__newIndex 元方法

与__index类似,不同之处是 __index用于table 的查询,__newIndex用于table 的更新。当对一个table 中不存在的索引赋值时,解释器会查找__newIndex元方法,如果有这个方法,解释器就不执行赋值而是调用它。如果这元方法是一个table,解释器就在此table中执行赋值,而不是对原来的table。
不想涉及__newIndex则使用 rawset( t , i )

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值